From e01fd115b367a25e6d143cfd79ccf12577cb051f Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Wed, 4 Dec 2024 12:10:14 -0500 Subject: [PATCH 1/2] group refactoring --- .../client/advisor/QuestionAnswerAdvisor.java | 2 +- .../advisor/VectorStoreChatMemoryAdvisor.java | 8 +- .../ai/chat/messages/UserMessage.java | 2 +- .../springframework/ai/document/Document.java | 137 +++++++++--------- .../org/springframework/ai/model/Media.java | 1 + .../ai/model/MediaContent.java | 3 +- .../ContextualQueryAugmenter.java | 2 +- .../ai/document/ContentFormatterTests.java | 30 ---- .../ai/document/DocumentBuilderTests.java | 62 ++------ .../ai/document/DocumentTests.java | 61 ++------ 10 files changed, 110 insertions(+), 198 deletions(-) diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/QuestionAnswerAdvisor.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/QuestionAnswerAdvisor.java index 2e935ab6254..21bcc41c521 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/QuestionAnswerAdvisor.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/QuestionAnswerAdvisor.java @@ -227,7 +227,7 @@ private AdvisedRequest before(AdvisedRequest request) { context.put(RETRIEVED_DOCUMENTS, documents); String documentContext = documents.stream() - .map(Content::getContent) + .map(Document::getText) .collect(Collectors.joining(System.lineSeparator())); // 4. Advise the user parameters. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/VectorStoreChatMemoryAdvisor.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/VectorStoreChatMemoryAdvisor.java index ccc58d8d6c2..ffc1bd6dd62 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/VectorStoreChatMemoryAdvisor.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/VectorStoreChatMemoryAdvisor.java @@ -43,6 +43,8 @@ /** * Memory is retrieved from a VectorStore added into the prompt's system text. * + * This only works for text based exchanges with the models, not multi-modal exchanges. + * * @author Christian Tzolov * @author Thomas Vitale * @since 1.0.0 @@ -146,7 +148,7 @@ private AdvisedRequest before(AdvisedRequest request) { List documents = this.getChatMemoryStore().similaritySearch(searchRequest); String longTermMemory = documents.stream() - .map(Content::getContent) + .map(Document::getText) .collect(Collectors.joining(System.lineSeparator())); Map advisedSystemParams = new HashMap<>(request.systemParams()); @@ -187,7 +189,9 @@ private List toDocuments(List messages, String conversationId if (message instanceof UserMessage userMessage) { return Document.builder() .content(userMessage.getContent()) - .media(new ArrayList<>(userMessage.getMedia())) + // userMessage.getMedia().get(0).getId() + //TODO vector store for memory would not store this into the vector store, could store an 'id' instead + // .media(userMessage.getMedia()) .metadata(metadata) .build(); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/UserMessage.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/UserMessage.java index 19f700b1f55..bff199409df 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/UserMessage.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/UserMessage.java @@ -71,7 +71,7 @@ public String toString() { } @Override - public Collection getMedia() { + public List getMedia() { return this.media; } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/document/Document.java b/spring-ai-core/src/main/java/org/springframework/ai/document/Document.java index df294c0b042..5c690bca930 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/document/Document.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/document/Document.java @@ -16,10 +16,8 @@ package org.springframework.ai.document; -import java.util.ArrayList; -import java.util.Collection; +import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Objects; @@ -31,7 +29,6 @@ import org.springframework.ai.document.id.IdGenerator; import org.springframework.ai.document.id.RandomIdGenerator; import org.springframework.ai.model.Media; -import org.springframework.ai.model.MediaContent; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -39,25 +36,28 @@ /** * A document is a container for the content and metadata of a document. It also contains * the document's unique ID and an optional embedding. + * + * Either string based text or Media is the content. */ @JsonIgnoreProperties({ "contentFormatter" }) -public class Document implements MediaContent { +public class Document { public static final ContentFormatter DEFAULT_CONTENT_FORMATTER = DefaultContentFormatter.defaultConfig(); - public static final String EMPTY_TEXT = ""; - /** * Unique ID */ private final String id; /** - * Document content. + * Document string content. */ - private final String content; + private final String text; - private final Collection media; + /** + * Document media content + */ + private final Media media; /** * Metadata for the document. It should not be nested and values should be restricted @@ -90,59 +90,63 @@ public Document(@JsonProperty("content") String content) { this(content, new HashMap<>()); } - public Document(String content, Map metadata) { - this(content, metadata, new RandomIdGenerator()); + public Document(String text, Map metadata) { + this(new RandomIdGenerator().generateId(), text, null, metadata, null); } - /** - * @deprecated Use builder instead: {@link Document#builder()}. - */ - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Document(String content, Collection media, Map metadata) { - this(new RandomIdGenerator().generateId(content, metadata), content, media, metadata); + public Document(String id, String text, Map metadata) { + this(id, text, null, metadata, null); } - /** - * @deprecated Use builder instead: {@link Document#builder()}. - */ - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Document(String content, Map metadata, IdGenerator idGenerator) { - this(idGenerator.generateId(content, metadata), content, metadata); + public Document(Media media, Map metadata) { + this(new RandomIdGenerator().generateId(), null, media, metadata, null); } - public Document(String id, String content, Map metadata) { - this(id, content, List.of(), metadata); + public Document(String id, Media media, Map metadata) { + this(id, null, media, metadata, null); } - /** - * @deprecated Use builder instead: {@link Document#builder()}. - */ - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Document(String id, String content, Collection media, Map metadata) { - this(id, content, media, metadata, null); + + private Document(String id, String text, Media media, Map metadata, @Nullable Double score) { + Assert.hasText(id, "id cannot be null or empty"); + Assert.notNull(metadata, "metadata cannot be null"); + Assert.noNullElements(metadata.keySet(), "metadata cannot have null keys"); + Assert.noNullElements(metadata.values(), "metadata cannot have null values"); + if (text == null && media == null) { + throw new IllegalArgumentException("need to specify either text or media"); + } + if (text != null && media != null) { + throw new IllegalArgumentException("can not specify both text and media"); + } + this.id = id; + this.text = text; + this.media = media; + this.metadata = new HashMap<>(metadata); + this.score = score; } + + /** * @deprecated Use builder instead: {@link Document#builder()}. */ @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Document(String id, String content, @Nullable Collection media, - @Nullable Map metadata, @Nullable Double score) { + public Document(String id, Media media, + Map metadata, @Nullable Double score) { Assert.hasText(id, "id cannot be null or empty"); - Assert.notNull(content, "content cannot be null"); Assert.notNull(media, "media cannot be null"); - Assert.noNullElements(media, "media cannot have null elements"); Assert.notNull(metadata, "metadata cannot be null"); Assert.noNullElements(metadata.keySet(), "metadata cannot have null keys"); Assert.noNullElements(metadata.values(), "metadata cannot have null values"); this.id = id; - this.content = content; - this.media = media != null ? media : List.of(); - this.metadata = metadata != null ? metadata : new HashMap<>(); + this.text = null; + this.media = media; + this.metadata = Collections.unmodifiableMap(metadata); this.score = score; } + public static Builder builder() { return new Builder(); } @@ -151,13 +155,21 @@ public String getId() { return this.id; } - @Override + @Deprecated public String getContent() { - return this.content; + return this.getText(); } - @Override - public Collection getMedia() { + public String getText() { + return this.text; + } + + public boolean isText() { + return this.text != null; + } + + + public Media getMedia() { return this.media; } @@ -180,7 +192,7 @@ public String getFormattedContent(ContentFormatter formatter, MetadataMode metad return formatter.format(this, metadataMode); } - @Override + public Map getMetadata() { return this.metadata; } @@ -228,8 +240,8 @@ public void setContentFormatter(ContentFormatter contentFormatter) { public Builder mutate() { return new Builder().id(this.id) - .content(this.content) - .media(new ArrayList<>(this.media)) + .content(this.text) + .media(this.media) .metadata(this.metadata) .score(this.score); } @@ -240,19 +252,19 @@ public boolean equals(Object o) { return false; } Document document = (Document) o; - return Objects.equals(this.id, document.id) && Objects.equals(this.content, document.content) + return Objects.equals(this.id, document.id) && Objects.equals(this.text, document.text) && Objects.equals(this.media, document.media) && Objects.equals(this.metadata, document.metadata) && Objects.equals(this.score, document.score); } @Override public int hashCode() { - return Objects.hash(this.id, this.content, this.media, this.metadata, this.score); + return Objects.hash(this.id, this.text, this.media, this.metadata, this.score); } @Override public String toString() { - return "Document{" + "id='" + this.id + '\'' + ", content='" + this.content + '\'' + ", media=" + this.media + return "Document{" + "id='" + this.id + '\'' + ", content='" + this.text + '\'' + ", metadata=" + this.metadata + ", score=" + this.score + '}'; } @@ -260,9 +272,9 @@ public static class Builder { private String id; - private String content = Document.EMPTY_TEXT; + private String text; - private List media = new ArrayList<>(); + private Media media; private Map metadata = new HashMap<>(); @@ -285,23 +297,22 @@ public Builder id(String id) { return this; } - public Builder content(String content) { - this.content = content; + public Builder text(String text) { + this.text = text; return this; } - public Builder media(List media) { - Assert.notNull(media, "media cannot be null"); - this.media.addAll(media); + public Builder content(String text) { + this.text = text; return this; } - public Builder media(Media... media) { - Assert.noNullElements(media, "media cannot contain null elements"); - this.media.addAll(List.of(media)); + public Builder media(Media media) { + this.media = media; return this; } + public Builder metadata(Map metadata) { this.metadata = metadata; return this; @@ -337,10 +348,6 @@ public Builder withContent(String content) { return content(content); } - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Builder withMedia(List media) { - return media(media); - } @Deprecated(since = "1.0.0-M5", forRemoval = true) public Builder withMedia(Media media) { @@ -359,9 +366,9 @@ public Builder withMetadata(String key, Object value) { public Document build() { if (!StringUtils.hasText(this.id)) { - this.id = this.idGenerator.generateId(this.content, this.metadata); + this.id = this.idGenerator.generateId(this.text, this.metadata); // TODO Review if metadata should be included } - var document = new Document(this.id, this.content, this.media, this.metadata, this.score); + var document = new Document(this.id, this.text, this.media, this.metadata, this.score); document.setEmbedding(this.embedding); return document; } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/Media.java b/spring-ai-core/src/main/java/org/springframework/ai/model/Media.java index f04fde901f2..f829d39763c 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/Media.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/Media.java @@ -111,6 +111,7 @@ public byte[] getDataAsByteArray() { } } + /** * Get the media id * @return the media id diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/MediaContent.java b/spring-ai-core/src/main/java/org/springframework/ai/model/MediaContent.java index 933ded36b67..a554b86e7f0 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/MediaContent.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/MediaContent.java @@ -17,12 +17,13 @@ package org.springframework.ai.model; import java.util.Collection; +import java.util.List; public interface MediaContent extends Content { /** * Get the media associated with the content. */ - Collection getMedia(); + List getMedia(); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java b/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java index e2a89aa7c66..d7e3fe251b7 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/rag/generation/augmentation/ContextualQueryAugmenter.java @@ -104,7 +104,7 @@ public Query augment(Query query, List documents) { // 1. Collect content from documents. String documentContext = documents.stream() - .map(Content::getContent) + .map(Document::getText) .collect(Collectors.joining(System.lineSeparator())); // 2. Define prompt parameters. diff --git a/spring-ai-core/src/test/java/org/springframework/ai/document/ContentFormatterTests.java b/spring-ai-core/src/test/java/org/springframework/ai/document/ContentFormatterTests.java index 5437d965cff..98b5dc6319c 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/document/ContentFormatterTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/document/ContentFormatterTests.java @@ -61,35 +61,5 @@ public void defaultConfigTextFormatter() { .isEqualTo(defaultConfigFormatter.format(this.document, MetadataMode.ALL)); } - @Test - public void customTextFormatter() { - - DefaultContentFormatter textFormatter = DefaultContentFormatter.builder() - .withExcludedEmbedMetadataKeys("embedKey2", "embedKey3") - .withExcludedInferenceMetadataKeys("llmKey2") - .withTextTemplate("Metadata:\n{metadata_string}\n\nText:{content}") - .withMetadataTemplate("Key/Value {key}={value}") - .build(); - - assertThat(this.document.getFormattedContent(textFormatter, MetadataMode.EMBED)).isEqualTo(""" - Metadata: - Key/Value llmKey2=value4 - Key/Value embedKey1=value1 - - Text:The World is Big and Salvation Lurks Around the Corner"""); - - assertThat(this.document.getContent()).isEqualTo(""" - The World is Big and Salvation Lurks Around the Corner"""); - - assertThat(this.document.getFormattedContent(textFormatter, MetadataMode.EMBED)) - .isEqualTo(textFormatter.format(this.document, MetadataMode.EMBED)); - - var documentWithCustomFormatter = new Document(this.document.getId(), this.document.getContent(), - this.document.getMetadata()); - documentWithCustomFormatter.setContentFormatter(textFormatter); - - assertThat(this.document.getFormattedContent(textFormatter, MetadataMode.ALL)) - .isEqualTo(documentWithCustomFormatter.getFormattedContent()); - } } diff --git a/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentBuilderTests.java b/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentBuilderTests.java index 2408aebf8b9..e6a9505082f 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentBuilderTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentBuilderTests.java @@ -19,7 +19,6 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; -import java.util.List; import java.util.Map; import org.junit.jupiter.api.BeforeEach; @@ -36,13 +35,11 @@ public class DocumentBuilderTests { private Document.Builder builder; - private static List getMediaList() { + private static Media getMedia() { try { URL mediaUrl1 = new URL("http://type1"); - URL mediaUrl2 = new URL("http://type2"); Media media1 = new Media(MimeTypeUtils.IMAGE_JPEG, mediaUrl1); - Media media2 = new Media(MimeTypeUtils.IMAGE_JPEG, mediaUrl2); - return List.of(media1, media2); + return media1; } catch (MalformedURLException e) { throw new RuntimeException(e); @@ -75,7 +72,7 @@ void testWithIdGeneratorNull() { @Test void testWithId() { - Document.Builder result = this.builder.id("testId"); + Document.Builder result = this.builder.text("text").id("testId"); assertThat(result).isSameAs(this.builder); assertThat(result.build().getId()).isEqualTo("testId"); @@ -83,10 +80,10 @@ void testWithId() { @Test void testWithIdNullOrEmpty() { - assertThatThrownBy(() -> this.builder.id(null).build()).isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> this.builder.text("text").id(null).build()).isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("id cannot be null or empty"); - assertThatThrownBy(() -> this.builder.id("").build()).isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> this.builder.text("text").id("").build()).isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("id cannot be null or empty"); } @@ -98,27 +95,6 @@ void testWithContent() { assertThat(result.build().getContent()).isEqualTo("Test content"); } - @Test - void testWithContentNull() { - assertThatThrownBy(() -> this.builder.content(null).build()).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("content cannot be null"); - } - - @Test - void testWithMediaList() { - List mediaList = getMediaList(); - Document.Builder result = this.builder.media(mediaList); - - assertThat(result).isSameAs(this.builder); - assertThat(result.build().getMedia()).isEqualTo(mediaList); - } - - @Test - void testWithMediaListNull() { - assertThatThrownBy(() -> this.builder.media((List) null).build()) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("media cannot be null"); - } @Test void testWithMediaSingle() throws MalformedURLException { @@ -128,13 +104,7 @@ void testWithMediaSingle() throws MalformedURLException { Document.Builder result = this.builder.media(media); assertThat(result).isSameAs(this.builder); - assertThat(result.build().getMedia()).contains(media); - } - - @Test - void testWithMediaSingleNull() { - assertThatThrownBy(() -> this.builder.media((Media) null).build()).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("media cannot contain null elements"); + assertThat(result.build().getMedia()).isEqualTo(media); } @Test @@ -142,7 +112,7 @@ void testWithMetadataMap() { Map metadata = new HashMap<>(); metadata.put("key1", "value1"); metadata.put("key2", 2); - Document.Builder result = this.builder.metadata(metadata); + Document.Builder result = this.builder.text("text").metadata(metadata); assertThat(result).isSameAs(this.builder); assertThat(result.build().getMetadata()).isEqualTo(metadata); @@ -150,7 +120,7 @@ void testWithMetadataMap() { @Test void testWithMetadataMapNull() { - assertThatThrownBy(() -> this.builder.metadata(null).build()).isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> this.builder.text("text").metadata(null).build()).isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("metadata cannot be null"); } @@ -159,26 +129,26 @@ void testWithMetadataKeyValue() { Document.Builder result = this.builder.metadata("key", "value"); assertThat(result).isSameAs(this.builder); - assertThat(result.build().getMetadata()).containsEntry("key", "value"); + assertThat(result.text("text").build().getMetadata()).containsEntry("key", "value"); } @Test void testWithMetadataKeyNull() { - assertThatThrownBy(() -> this.builder.metadata(null, "value").build()) + assertThatThrownBy(() -> this.builder.text("text").metadata(null, "value").build()) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("metadata cannot have null keys"); } @Test void testWithMetadataValueNull() { - assertThatThrownBy(() -> this.builder.metadata("key", null).build()) + assertThatThrownBy(() -> this.builder.text("text").metadata("key", null).build()) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("metadata cannot have null values"); } @Test void testBuildWithoutId() { - Document document = this.builder.content("Test content").build(); + Document document = this.builder.text("text").content("Test content").build(); assertThat(document.getId()).isNotNull().isNotEmpty(); assertThat(document.getContent()).isEqualTo("Test content"); @@ -187,19 +157,17 @@ void testBuildWithoutId() { @Test void testBuildWithAllProperties() { - List mediaList = getMediaList(); + Media media = getMedia(); Map metadata = new HashMap<>(); metadata.put("key", "value"); Document document = this.builder.id("customId") - .content("Test content") - .media(mediaList) + .text("Test content") .metadata(metadata) .build(); assertThat(document.getId()).isEqualTo("customId"); - assertThat(document.getContent()).isEqualTo("Test content"); - assertThat(document.getMedia()).isEqualTo(mediaList); + assertThat(document.getText()).isEqualTo("Test content"); assertThat(document.getMetadata()).isEqualTo(metadata); } diff --git a/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentTests.java b/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentTests.java index f4926e05015..a2d92be647f 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentTests.java @@ -27,6 +27,7 @@ import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; public class DocumentTests { @@ -45,30 +46,9 @@ void testNullScore() { assertThat(document.getScore()).isNull(); } - @Test - void testMediaBuilderIsAdditive() { - try { - URL mediaUrl1 = new URL("http://type1"); - URL mediaUrl2 = new URL("http://type2"); - URL mediaUrl3 = new URL("http://type3"); - - Media media1 = new Media(MimeTypeUtils.IMAGE_JPEG, mediaUrl1); - Media media2 = new Media(MimeTypeUtils.IMAGE_JPEG, mediaUrl2); - Media media3 = new Media(MimeTypeUtils.IMAGE_JPEG, mediaUrl3); - - Document document = Document.builder().media(media1).media(media2).media(List.of(media3)).build(); - - assertThat(document.getMedia()).hasSize(3).containsExactly(media1, media2, media3); - - } - catch (MalformedURLException e) { - throw new RuntimeException(e); - } - } - @Test void testMutate() { - List mediaList = getMediaList(); + Media media = getMedia(); Map metadata = new HashMap<>(); metadata.put("key", "value"); Double score = 0.95; @@ -76,7 +56,7 @@ void testMutate() { Document original = Document.builder() .id("customId") .content("Test content") - .media(mediaList) + .media(null) .metadata(metadata) .score(score) .build(); @@ -88,23 +68,21 @@ void testMutate() { @Test void testEquals() { - List mediaList = getMediaList(); + Media media = getMedia(); Map metadata = new HashMap<>(); metadata.put("key", "value"); Double score = 0.95; Document doc1 = Document.builder() .id("customId") - .content("Test content") - .media(mediaList) + .text("Test text") .metadata(metadata) .score(score) .build(); Document doc2 = Document.builder() .id("customId") - .content("Test content") - .media(mediaList) + .text("Test text") .metadata(metadata) .score(score) .build(); @@ -112,7 +90,6 @@ void testEquals() { Document differentDoc = Document.builder() .id("differentId") .content("Different content") - .media(mediaList) .metadata(metadata) .score(score) .build(); @@ -124,17 +101,12 @@ void testEquals() { @Test void testEmptyDocument() { - Document emptyDoc = Document.builder().build(); - - assertThat(emptyDoc.getContent()).isEqualTo(Document.EMPTY_TEXT).isEmpty(); - assertThat(emptyDoc.getMedia()).isEmpty(); - assertThat(emptyDoc.getMetadata()).isEmpty(); - assertThat(emptyDoc.getScore()).isNull(); + assertThrows(IllegalArgumentException.class, () -> Document.builder().build()); } @Test void testToString() { - List mediaList = getMediaList(); + Media media = getMedia(); Map metadata = new HashMap<>(); metadata.put("key", "value"); Double score = 0.95; @@ -142,7 +114,7 @@ void testToString() { Document document = Document.builder() .id("customId") .content("Test content") - .media(mediaList) + .media(null) .metadata(metadata) .score(score) .build(); @@ -151,27 +123,16 @@ void testToString() { assertThat(toString).contains("id='customId'") .contains("content='Test content'") - .contains("media=" + mediaList) .contains("metadata=" + metadata) .contains("score=" + score); } - @Test - void testToStringWithEmptyDocument() { - Document emptyDoc = Document.builder().build(); - - String toString = emptyDoc.toString(); - - assertThat(toString).contains("content=''").contains("media=[]").contains("metadata={}").contains("score=null"); - } - private static List getMediaList() { + private static Media getMedia() { try { URL mediaUrl1 = new URL("http://type1"); - URL mediaUrl2 = new URL("http://type2"); Media media1 = new Media(MimeTypeUtils.IMAGE_JPEG, mediaUrl1); - Media media2 = new Media(MimeTypeUtils.IMAGE_JPEG, mediaUrl2); - return List.of(media1, media2); + return media1; } catch (MalformedURLException e) { throw new RuntimeException(e); From 285b9ffef3913093a618959e606c5677670ffae8 Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Fri, 6 Dec 2024 16:26:50 -0500 Subject: [PATCH 2/2] Make Document support single text or media content The Document class previously allowed multiple media entries while also having a text field, leading to ambiguity in content handling. This change enforces a clear separation between text and media documents to prevent content type confusion and simplify document processing. A Document now must contain either text content or a single media entry, but never both. This aligns with the class's primary use in ETL pipelines where clear content type boundaries are essential for proper embedding generation and vector database storage. Additional architectural changes: - Document now implements a cleaner API by removing deprecated methods - Removed MediaContent interface implementation from Document class - Document.getMedia() now returns a single Media object instead of Collection - Removed EMPTY_TEXT constant in favor of proper null handling - Constructor signatures simplified and streamlined - Builder pattern improved to enforce single content type constraint The breaking changes include: - Media is now a single entry instead of a collection - Content field renamed to text for clarity - Removed support for mixed content types - Simplified builder API to prevent ambiguous construction We prefer using text-related methods over deprecated content methods to better reflect the actual content type being handled and improve API clarity. --- .../markdown/MarkdownDocumentReader.java | 2 +- .../ai/anthropic/AnthropicChatModel.java | 8 +- .../ai/anthropic/AnthropicChatModelIT.java | 24 +- .../AnthropicChatModelObservationIT.java | 4 +- .../client/AnthropicChatClientIT.java | 2 +- .../ai/azure/openai/AzureOpenAiChatModel.java | 6 +- .../azure/openai/AzureOpenAiChatClientIT.java | 4 +- .../azure/openai/AzureOpenAiChatModelIT.java | 18 +- .../AzureOpenAiChatModelObservationIT.java | 4 +- .../AzureOpenAiChatModelFunctionCallIT.java | 8 +- .../AzureOpenAiChatModelMetadataTests.java | 2 +- .../converse/BedrockProxyChatModel.java | 8 +- .../converse/BedrockConverseChatClientIT.java | 8 +- .../BedrockConverseUsageAggregationTests.java | 4 +- .../converse/BedrockProxyChatModelIT.java | 22 +- .../BedrockProxyChatModelObservationIT.java | 4 +- .../ai/bedrock/MessageToPromptConverter.java | 8 +- .../BedrockAnthropic3ChatModel.java | 4 +- .../BedrockAnthropicChatModelIT.java | 14 +- .../BedrockAnthropic3ChatModelIT.java | 18 +- .../cohere/BedrockCohereChatModelIT.java | 14 +- .../BedrockAi21Jurassic2ChatModelIT.java | 10 +- .../llama/BedrockLlamaChatModelIT.java | 14 +- .../titan/BedrockTitanChatModelIT.java | 14 +- .../ai/huggingface/client/ClientIT.java | 4 +- .../ai/minimax/MiniMaxChatModel.java | 4 +- .../ai/minimax/api/MiniMaxRetryTests.java | 4 +- .../chat/MiniMaxChatModelObservationIT.java | 4 +- .../minimax/chat/MiniMaxChatOptionsTests.java | 8 +- .../ai/mistralai/MistralAiChatModel.java | 6 +- .../ai/mistralai/MistralAiChatClientIT.java | 6 +- .../ai/mistralai/MistralAiChatModelIT.java | 14 +- .../MistralAiChatModelObservationIT.java | 4 +- .../ai/mistralai/MistralAiRetryTests.java | 4 +- .../ai/moonshot/MoonshotChatModel.java | 4 +- .../ai/moonshot/MoonshotRetryTests.java | 4 +- .../MoonshotChatModelFunctionCallingIT.java | 4 +- .../ai/moonshot/chat/MoonshotChatModelIT.java | 12 +- .../chat/MoonshotChatModelObservationIT.java | 4 +- .../ai/oci/cohere/OCICohereChatModel.java | 8 +- .../ai/oci/cohere/OCICohereChatModelIT.java | 2 +- .../ai/ollama/OllamaChatModel.java | 6 +- .../OllamaChatModelFunctionCallingIT.java | 4 +- .../ai/ollama/OllamaChatModelIT.java | 16 +- .../ollama/OllamaChatModelMultimodalIT.java | 4 +- .../ollama/OllamaChatModelObservationIT.java | 4 +- .../ai/openai/OpenAiChatModel.java | 7 +- .../OpenAiChatModelFunctionCallingIT.java | 4 +- .../ai/openai/chat/OpenAiChatModelIT.java | 54 ++--- .../chat/OpenAiChatModelObservationIT.java | 4 +- .../chat/OpenAiChatModelProxyToolCallsIT.java | 8 +- .../chat/OpenAiChatModelResponseFormatIT.java | 6 +- ...delTypeReferenceBeanOutputConverterIT.java | 4 +- .../chat/OpenAiCompatibleChatModelIT.java | 4 +- .../ai/openai/chat/OpenAiRetryTests.java | 4 +- .../chat/client/OpenAiChatClientIT.java | 4 +- .../OpenAiChatClientProxyFunctionCallsIT.java | 2 +- .../chat/proxy/GroqWithOpenAiChatModelIT.java | 32 +-- .../proxy/MistralWithOpenAiChatModelIT.java | 32 +-- .../proxy/NvidiaWithOpenAiChatModelIT.java | 18 +- .../proxy/OllamaWithOpenAiChatModelIT.java | 32 +-- .../PerplexityWithOpenAiChatModelIT.java | 17 +- .../ai/openai/testutils/AbstractIT.java | 6 +- .../ai/qianfan/QianFanChatModel.java | 2 +- .../ai/qianfan/api/QianFanRetryTests.java | 4 +- .../ai/qianfan/chat/QianFanChatModelIT.java | 4 +- .../chat/QianFanChatModelObservationIT.java | 4 +- .../VertexAiMultimodalEmbeddingModel.java | 63 +++-- .../VertexAiMultimodalEmbeddingModelIT.java | 2 +- .../gemini/VertexAiGeminiChatModel.java | 12 +- .../VertexAiChatModelObservationIT.java | 4 +- .../gemini/VertexAiGeminiChatModelIT.java | 22 +- .../gemini/VertexAiGeminiRetryTests.java | 2 +- ...texAiGeminiChatModelFunctionCallingIT.java | 12 +- .../utils/MessageToPromptConverter.java | 8 +- .../ai/zhipuai/ZhiPuAiChatModel.java | 7 +- .../ai/zhipuai/api/ZhiPuAiRetryTests.java | 4 +- .../ai/zhipuai/chat/ZhiPuAiChatModelIT.java | 36 +-- .../chat/ZhiPuAiChatModelObservationIT.java | 4 +- .../ai/chat/client/DefaultChatClient.java | 20 +- .../advisor/PromptChatMemoryAdvisor.java | 2 +- .../advisor/VectorStoreChatMemoryAdvisor.java | 13 +- .../ai/chat/messages/AbstractMessage.java | 2 +- .../ai/chat/messages/SystemMessage.java | 2 +- .../ai/chat/messages/UserMessage.java | 4 +- .../chat/model/AbstractToolCallSupport.java | 2 +- .../ai/chat/model/ChatModel.java | 4 +- .../ai/chat/model/MessageAggregator.java | 4 +- .../ai/chat/model/StreamingChatModel.java | 8 +- .../ChatModelObservationContentProcessor.java | 8 +- .../ai/chat/prompt/Prompt.java | 9 +- .../springframework/ai/document/Document.java | 224 ++++++++++++------ .../ai/evaluation/Evaluator.java | 2 +- .../org/springframework/ai/model/Content.java | 2 +- .../org/springframework/ai/model/Media.java | 1 - .../tokenizer/JTokkitTokenCountEstimator.java | 4 +- .../transformer/KeywordMetadataEnricher.java | 2 +- .../transformer/SummaryMetadataEnricher.java | 2 +- .../vectorstore/SimpleVectorStoreContent.java | 46 ++-- .../ai/chat/ChatModelTests.java | 4 +- .../chat/client/ChatClientAdvisorTests.java | 18 +- .../client/ChatClientResponseEntityTests.java | 6 +- .../ai/chat/client/ChatClientTest.java | 86 +++---- .../chat/client/DefaultChatClientTests.java | 58 ++--- .../advisor/QuestionAnswerAdvisorTests.java | 12 +- .../RetrievalAugmentationAdvisorTests.java | 6 +- .../advisor/SimpleLoggerAdvisorTests.java | 2 +- .../ai/chat/model/GenerationTests.java | 2 +- .../ai/document/ContentFormatterTests.java | 1 - .../ai/document/DocumentBuilderTests.java | 22 +- .../ai/document/DocumentTests.java | 133 +++++++++-- .../ai/prompt/PromptTemplateTest.java | 2 +- .../vectorstore/SimpleVectorStoreTests.java | 14 +- .../RetrievalAugmentationAdvisorIT.java | 8 +- .../vectorstore/SimpleVectorStoreIT.java | 10 +- .../AnthropicAutoConfigurationIT.java | 4 +- .../tool/FunctionCallWithFunctionBeanIT.java | 6 +- .../FunctionCallWithPromptFunctionIT.java | 2 +- .../azure/AzureOpenAiAutoConfigurationIT.java | 4 +- ...OpenAiDirectOpenAiAutoConfigurationIT.java | 4 +- .../tool/FunctionCallWithFunctionBeanIT.java | 6 +- .../FunctionCallWithFunctionWrapperIT.java | 2 +- .../FunctionCallWithPromptFunctionIT.java | 2 +- ...drockAnthropicChatAutoConfigurationIT.java | 4 +- ...rockAnthropic3ChatAutoConfigurationIT.java | 4 +- .../BedrockCohereChatAutoConfigurationIT.java | 4 +- ...kConverseProxyChatAutoConfigurationIT.java | 2 +- .../tool/FunctionCallWithFunctionBeanIT.java | 6 +- .../FunctionCallWithPromptFunctionIT.java | 2 +- ...kAi21Jurassic2ChatAutoConfigurationIT.java | 2 +- .../BedrockLlamaChatAutoConfigurationIT.java | 4 +- .../BedrockTitanChatAutoConfigurationIT.java | 4 +- ...assandraChatMemoryAutoConfigurationIT.java | 6 +- .../HuggingfaceChatAutoConfigurationIT.java | 2 +- .../minimax/FunctionCallbackInPromptIT.java | 4 +- ...nctionCallbackWithPlainFunctionBeanIT.java | 8 +- .../minimax/MiniMaxAutoConfigurationIT.java | 2 +- .../minimax/MiniMaxFunctionCallbackIT.java | 4 +- .../MistralAiAutoConfigurationIT.java | 2 +- .../mistralai/tool/PaymentStatusBeanIT.java | 4 +- .../tool/PaymentStatusBeanOpenAiIT.java | 4 +- .../mistralai/tool/PaymentStatusPromptIT.java | 4 +- .../tool/WeatherServicePromptIT.java | 4 +- .../moonshot/MoonshotAutoConfigurationIT.java | 2 +- .../tool/FunctionCallbackInPromptIT.java | 4 +- ...nctionCallbackWithPlainFunctionBeanIT.java | 8 +- .../tool/MoonshotFunctionCallbackIT.java | 4 +- .../ollama/OllamaChatAutoConfigurationIT.java | 6 +- .../tool/FunctionCallbackInPromptIT.java | 4 +- .../ollama/tool/OllamaFunctionCallbackIT.java | 8 +- .../openai/OpenAiAutoConfigurationIT.java | 4 +- .../tool/FunctionCallbackInPromptIT.java | 4 +- ...nctionCallbackWithPlainFunctionBeanIT.java | 18 +- .../openai/tool/OpenAiFunctionCallbackIT.java | 4 +- .../qianfan/QianFanAutoConfigurationIT.java | 2 +- .../VertexAiGeminiAutoConfigurationIT.java | 2 +- .../tool/FunctionCallWithFunctionBeanIT.java | 10 +- .../FunctionCallWithFunctionWrapperIT.java | 2 +- .../FunctionCallWithPromptFunctionIT.java | 4 +- .../zhipuai/ZhiPuAiAutoConfigurationIT.java | 2 +- .../tool/FunctionCallbackInPromptIT.java | 4 +- ...nctionCallbackWithPlainFunctionBeanIT.java | 8 +- .../tool/ZhipuAiFunctionCallbackIT.java | 4 +- .../tool/FunctionCallbackContextKotlinIT.kt | 6 +- .../ollama/tool/FunctionCallbackKotlinIT.kt | 6 +- .../ai/evaluation/BasicEvaluationTest.java | 4 +- .../ai/vectorstore/CosmosDBVectorStore.java | 2 +- .../vectorstore/azure/AzureVectorStore.java | 2 +- .../ai/chat/memory/CassandraChatMemory.java | 2 +- .../ai/vectorstore/CassandraVectorStore.java | 2 +- .../chroma/vectorstore/ChromaVectorStore.java | 2 +- .../vectorstore/ChromaVectorStoreIT.java | 2 +- .../ai/vectorstore/CoherenceVectorStore.java | 2 +- .../ai/vectorstore/GemFireVectorStore.java | 2 +- .../CricketWorldCupHanaController.java | 2 +- .../ai/vectorstore/MilvusVectorStore.java | 2 +- .../vectorstore/MongoDBAtlasVectorStore.java | 2 +- .../ai/vectorstore/Neo4jVectorStore.java | 2 +- .../ai/vectorstore/OracleVectorStore.java | 2 +- .../ai/vectorstore/PgVectorStore.java | 2 +- .../PgVectorStoreWithChatMemoryAdvisorIT.java | 2 +- .../ai/vectorstore/PineconeVectorStore.java | 2 +- .../vectorstore/qdrant/QdrantVectorStore.java | 7 +- .../ai/vectorstore/RedisVectorStore.java | 7 +- .../ai/vectorstore/TypesenseVectorStore.java | 2 +- .../ai/vectorstore/WeaviateVectorStore.java | 2 +- 186 files changed, 974 insertions(+), 829 deletions(-) diff --git a/document-readers/markdown-reader/src/main/java/org/springframework/ai/reader/markdown/MarkdownDocumentReader.java b/document-readers/markdown-reader/src/main/java/org/springframework/ai/reader/markdown/MarkdownDocumentReader.java index 393846724f1..630c2034195 100644 --- a/document-readers/markdown-reader/src/main/java/org/springframework/ai/reader/markdown/MarkdownDocumentReader.java +++ b/document-readers/markdown-reader/src/main/java/org/springframework/ai/reader/markdown/MarkdownDocumentReader.java @@ -226,7 +226,7 @@ private void buildAndFlush() { if (!this.currentParagraphs.isEmpty()) { String content = String.join("", this.currentParagraphs); - Document.Builder builder = this.currentDocumentBuilder.content(content); + Document.Builder builder = this.currentDocumentBuilder.text(content); this.config.additionalMetadata.forEach(builder::metadata); diff --git a/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java b/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java index 89e8648a072..c68fb6d29bc 100644 --- a/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java +++ b/models/spring-ai-anthropic/src/main/java/org/springframework/ai/anthropic/AnthropicChatModel.java @@ -378,7 +378,7 @@ ChatCompletionRequest createRequest(Prompt prompt, boolean stream) { .filter(message -> message.getMessageType() != MessageType.SYSTEM) .map(message -> { if (message.getMessageType() == MessageType.USER) { - List contents = new ArrayList<>(List.of(new ContentBlock(message.getContent()))); + List contents = new ArrayList<>(List.of(new ContentBlock(message.getText()))); if (message instanceof UserMessage userMessage) { if (!CollectionUtils.isEmpty(userMessage.getMedia())) { List mediaContent = userMessage.getMedia().stream().map(media -> { @@ -395,8 +395,8 @@ ChatCompletionRequest createRequest(Prompt prompt, boolean stream) { else if (message.getMessageType() == MessageType.ASSISTANT) { AssistantMessage assistantMessage = (AssistantMessage) message; List contentBlocks = new ArrayList<>(); - if (StringUtils.hasText(message.getContent())) { - contentBlocks.add(new ContentBlock(message.getContent())); + if (StringUtils.hasText(message.getText())) { + contentBlocks.add(new ContentBlock(message.getText())); } if (!CollectionUtils.isEmpty(assistantMessage.getToolCalls())) { for (AssistantMessage.ToolCall toolCall : assistantMessage.getToolCalls()) { @@ -423,7 +423,7 @@ else if (message.getMessageType() == MessageType.TOOL) { String systemPrompt = prompt.getInstructions() .stream() .filter(m -> m.getMessageType() == MessageType.SYSTEM) - .map(m -> m.getContent()) + .map(m -> m.getText()) .collect(Collectors.joining(System.lineSeparator())); ChatCompletionRequest request = new ChatCompletionRequest(this.defaultOptions.getModel(), userMessages, diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java index 0777acf5b8f..aa62746bc7d 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelIT.java @@ -105,7 +105,7 @@ void roleTest(String modelName) { .isEqualTo(response.getMetadata().getUsage().getPromptTokens() + response.getMetadata().getUsage().getGenerationTokens()); Generation generation = response.getResults().get(0); - assertThat(generation.getOutput().getContent()).contains("Blackbeard"); + assertThat(generation.getOutput().getText()).contains("Blackbeard"); assertThat(generation.getMetadata().getFinishReason()).isEqualTo("end_turn"); logger.info(response.toString()); } @@ -120,13 +120,13 @@ void testMessageHistory() { AnthropicChatOptions.builder().withModel("claude-3-sonnet-20240229").build()); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); var promptWithMessageHistory = new Prompt(List.of(new UserMessage("Dummy"), response.getResult().getOutput(), new UserMessage("Repeat the last assistant message."))); response = this.chatModel.call(promptWithMessageHistory); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); } @Test @@ -162,7 +162,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = listOutputConverter.convert(generation.getOutput().getContent()); + List list = listOutputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -180,7 +180,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = mapOutputConverter.convert(generation.getOutput().getContent()); + Map result = mapOutputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -199,7 +199,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = beanOutputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = beanOutputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -225,7 +225,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = beanOutputConverter.convert(generationTextFromStream); @@ -244,8 +244,8 @@ void multiModalityTest() throws IOException { var response = this.chatModel.call(new Prompt(List.of(userMessage))); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("banan", "apple", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("banan", "apple", "basket"); } @Test @@ -262,7 +262,7 @@ void multiModalityPdfTest() throws IOException { .withModel(AnthropicApi.ChatModel.CLAUDE_3_5_SONNET.getName()) .build())); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Spring AI", "portable API"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Spring AI", "portable API"); } @Test @@ -288,7 +288,7 @@ void functionCallTest() { logger.info("Response: {}", response); Generation generation = response.getResult(); - assertThat(generation.getOutput().getContent()).contains("30", "10", "15"); + assertThat(generation.getOutput().getText()).contains("30", "10", "15"); } @Test @@ -317,7 +317,7 @@ void streamFunctionCallTest() { .block() .stream() .filter(cr -> cr.getResult() != null) - .map(cr -> cr.getResult().getOutput().getContent()) + .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelObservationIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelObservationIT.java index 4eec3d349f4..af423708df1 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelObservationIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/AnthropicChatModelObservationIT.java @@ -79,7 +79,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -109,7 +109,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() .filter(r -> r.getResult() != null) - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java index f6d1a889100..41b53b180a9 100644 --- a/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java +++ b/models/spring-ai-anthropic/src/test/java/org/springframework/ai/anthropic/client/AnthropicChatClientIT.java @@ -84,7 +84,7 @@ void call() { logger.info("" + response); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test diff --git a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java index 04de1e3e4e9..226a9eef067 100644 --- a/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java +++ b/models/spring-ai-azure-openai/src/main/java/org/springframework/ai/azure/openai/AzureOpenAiChatModel.java @@ -402,7 +402,7 @@ private List fromSpringAiMessage(Message message) { case USER: // https://github.com/Azure/azure-sdk-for-java/blob/main/sdk/openai/azure-ai-openai/README.md#text-completions-with-images List items = new ArrayList<>(); - items.add(new ChatMessageTextContentItem(message.getContent())); + items.add(new ChatMessageTextContentItem(message.getText())); if (message instanceof UserMessage userMessage) { if (!CollectionUtils.isEmpty(userMessage.getMedia())) { items.addAll(userMessage.getMedia() @@ -413,7 +413,7 @@ private List fromSpringAiMessage(Message message) { } return List.of(new ChatRequestUserMessage(items)); case SYSTEM: - return List.of(new ChatRequestSystemMessage(message.getContent())); + return List.of(new ChatRequestSystemMessage(message.getText())); case ASSISTANT: AssistantMessage assistantMessage = (AssistantMessage) message; List toolCalls = null; @@ -425,7 +425,7 @@ private List fromSpringAiMessage(Message message) { .map(tc -> ((ChatCompletionsToolCall) tc)) // !!! .toList(); } - var azureAssistantMessage = new ChatRequestAssistantMessage(message.getContent()); + var azureAssistantMessage = new ChatRequestAssistantMessage(message.getText()); azureAssistantMessage.setToolCalls(toolCalls); return List.of(azureAssistantMessage); case TOOL: diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatClientIT.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatClientIT.java index e974743fcc6..6836a06a62c 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatClientIT.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatClientIT.java @@ -68,7 +68,7 @@ void call() { // @formatter:on assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -94,7 +94,7 @@ void beanStreamOutputConverterRecords() { String generationTextFromStream = chatResponses .stream() - .map(cr -> cr.getResult().getOutput().getContent()) + .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); // @formatter:on diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java index 8bf66e6188e..04b34be648b 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelIT.java @@ -77,7 +77,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); } @Test @@ -96,14 +96,14 @@ void testMessageHistory() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard"); var promptWithMessageHistory = new Prompt(List.of(new UserMessage("Dummy"), response.getResult().getOutput(), new UserMessage("Repeat the last assistant message."))); response = this.chatModel.call(promptWithMessageHistory); - System.out.println(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard"); + System.out.println(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard"); } @Test @@ -121,7 +121,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -140,7 +140,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -159,7 +159,7 @@ void beanOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.actor()).isNotNull(); } @@ -177,7 +177,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -203,7 +203,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelObservationIT.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelObservationIT.java index 924ea78f71b..6367ec7e9da 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelObservationIT.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/AzureOpenAiChatModelObservationIT.java @@ -76,7 +76,7 @@ void observationForImperativeChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -106,7 +106,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java index 8adb93fede8..a80817cd1a3 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/function/AzureOpenAiChatModelFunctionCallIT.java @@ -80,7 +80,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -104,7 +104,7 @@ void functionCallSequentialTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -132,7 +132,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -169,7 +169,7 @@ void functionCallSequentialAndStreamTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); diff --git a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/metadata/AzureOpenAiChatModelMetadataTests.java b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/metadata/AzureOpenAiChatModelMetadataTests.java index 8de56f2dbd1..97e95bebb70 100644 --- a/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/metadata/AzureOpenAiChatModelMetadataTests.java +++ b/models/spring-ai-azure-openai/src/test/java/org/springframework/ai/azure/openai/metadata/AzureOpenAiChatModelMetadataTests.java @@ -84,7 +84,7 @@ void azureOpenAiMetadataCapturedDuringGeneration() { assertThat(generation).isNotNull() .extracting(Generation::getOutput) - .extracting(AssistantMessage::getContent) + .extracting(AssistantMessage::getText) .isEqualTo("No! You will actually land with a resounding thud. This is the way!"); // assertPromptMetadata(response); diff --git a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java index 6e632ff3588..8c06f37b5f6 100644 --- a/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java +++ b/models/spring-ai-bedrock-converse/src/main/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModel.java @@ -249,7 +249,7 @@ ConverseRequest createRequest(Prompt prompt) { List contents = new ArrayList<>(); if (message instanceof UserMessage) { var userMessage = (UserMessage) message; - contents.add(ContentBlock.fromText(userMessage.getContent())); + contents.add(ContentBlock.fromText(userMessage.getText())); if (!CollectionUtils.isEmpty(userMessage.getMedia())) { List mediaContent = userMessage.getMedia().stream().map(media -> { @@ -268,8 +268,8 @@ ConverseRequest createRequest(Prompt prompt) { else if (message.getMessageType() == MessageType.ASSISTANT) { AssistantMessage assistantMessage = (AssistantMessage) message; List contentBlocks = new ArrayList<>(); - if (StringUtils.hasText(message.getContent())) { - contentBlocks.add(ContentBlock.fromText(message.getContent())); + if (StringUtils.hasText(message.getText())) { + contentBlocks.add(ContentBlock.fromText(message.getText())); } if (!CollectionUtils.isEmpty(assistantMessage.getToolCalls())) { for (AssistantMessage.ToolCall toolCall : assistantMessage.getToolCalls()) { @@ -309,7 +309,7 @@ else if (message.getMessageType() == MessageType.TOOL) { List systemMessages = prompt.getInstructions() .stream() .filter(m -> m.getMessageType() == MessageType.SYSTEM) - .map(sysMessage -> SystemContentBlock.builder().text(sysMessage.getContent()).build()) + .map(sysMessage -> SystemContentBlock.builder().text(sysMessage.getText()).build()) .toList(); FunctionCallingOptions updatedRuntimeOptions = (FunctionCallingOptions) this.defaultOptions.copy(); diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java index 5317e31a712..d34f920280a 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseChatClientIT.java @@ -79,7 +79,7 @@ void call() { logger.info("" + response); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -196,7 +196,7 @@ void beanStreamOutputConverterRecords() { String generationTextFromStream = chatResponses .stream() .filter(cr -> cr.getResult() != null) - .map(cr -> cr.getResult().getOutput().getContent()) + .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); // @formatter:on @@ -259,7 +259,7 @@ void functionCallWithUsageMetadataTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -340,7 +340,7 @@ void streamFunctionCallTest() { String content = chatResponses.stream() .filter(cr -> cr.getResult() != null) - .map(cr -> cr.getResult().getOutput().getContent()) + .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseUsageAggregationTests.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseUsageAggregationTests.java index 097982d3e74..e4d74743523 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseUsageAggregationTests.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockConverseUsageAggregationTests.java @@ -83,7 +83,7 @@ public void call() { var result = this.chatModel.call(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.getResult().getOutput().getContent()).isSameAs("Response Content Block"); + assertThat(result.getResult().getOutput().getText()).isSameAs("Response Content Block"); assertThat(result.getMetadata().getUsage().getPromptTokens()).isEqualTo(16); assertThat(result.getMetadata().getUsage().getGenerationTokens()).isEqualTo(14); @@ -148,7 +148,7 @@ public void callWithToolUse() { PortableFunctionCallingOptions.builder().withFunctionCallbacks(functionCallback).build())); assertThat(result).isNotNull(); - assertThat(result.getResult().getOutput().getContent()) + assertThat(result.getResult().getOutput().getText()) .isSameAs(converseResponseFinal.output().message().content().get(0).text()); assertThat(result.getMetadata().getUsage().getPromptTokens()).isEqualTo(445 + 540); diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java index 27bb6d936ed..e24e06d909f 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelIT.java @@ -101,7 +101,7 @@ void roleTest(String modelName) { .isEqualTo(response.getMetadata().getUsage().getPromptTokens() + response.getMetadata().getUsage().getGenerationTokens()); Generation generation = response.getResults().get(0); - assertThat(generation.getOutput().getContent()).contains("Blackbeard"); + assertThat(generation.getOutput().getText()).contains("Blackbeard"); assertThat(generation.getMetadata().getFinishReason()).isEqualTo("end_turn"); logger.info(response.toString()); } @@ -116,14 +116,14 @@ void testMessageHistory() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); var promptWithMessageHistory = new Prompt(List.of(new UserMessage("Dummy"), response.getResult().getOutput(), new UserMessage("Repeat the last assistant message."))); response = this.chatModel.call(promptWithMessageHistory); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); } @Test @@ -159,7 +159,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = listOutputConverter.convert(generation.getOutput().getContent()); + List list = listOutputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -177,7 +177,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = mapOutputConverter.convert(generation.getOutput().getContent()); + Map result = mapOutputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -196,7 +196,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = beanOutputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = beanOutputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -222,7 +222,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = beanOutputConverter.convert(generationTextFromStream); @@ -241,8 +241,8 @@ void multiModalityTest() throws IOException { var response = this.chatModel.call(new Prompt(List.of(userMessage))); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("banan", "apple", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("banan", "apple", "basket"); } @Test @@ -267,7 +267,7 @@ void functionCallTest() { logger.info("Response: {}", response); Generation generation = response.getResult(); - assertThat(generation.getOutput().getContent()).contains("30", "10", "15"); + assertThat(generation.getOutput().getText()).contains("30", "10", "15"); } @Test @@ -296,7 +296,7 @@ void streamFunctionCallTest() { .block() .stream() .filter(cr -> cr.getResult() != null) - .map(cr -> cr.getResult().getOutput().getContent()) + .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelObservationIT.java b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelObservationIT.java index 1b2be8a2724..07c79bdae27 100644 --- a/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelObservationIT.java +++ b/models/spring-ai-bedrock-converse/src/test/java/org/springframework/ai/bedrock/converse/BedrockProxyChatModelObservationIT.java @@ -80,7 +80,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -109,7 +109,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() .filter(r -> r.getResult() != null) - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/MessageToPromptConverter.java b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/MessageToPromptConverter.java index fb42f6b6f43..7117a8370e1 100644 --- a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/MessageToPromptConverter.java +++ b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/MessageToPromptConverter.java @@ -66,7 +66,7 @@ public String toPrompt(List messages) { final String systemMessages = messages.stream() .filter(message -> message.getMessageType() == MessageType.SYSTEM) - .map(Message::getContent) + .map(Message::getText) .collect(Collectors.joining(System.lineSeparator())); final String userMessages = messages.stream() @@ -83,11 +83,11 @@ public String toPrompt(List messages) { protected String messageToString(Message message) { switch (message.getMessageType()) { case SYSTEM: - return message.getContent(); + return message.getText(); case USER: - return this.humanPrompt + " " + message.getContent(); + return this.humanPrompt + " " + message.getText(); case ASSISTANT: - return this.assistantPrompt + " " + message.getContent(); + return this.assistantPrompt + " " + message.getText(); case TOOL: throw new IllegalArgumentException("Tool execution results are not supported for Bedrock models"); } diff --git a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModel.java b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModel.java index a9d1a620f2f..9a5b35da8fe 100644 --- a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModel.java +++ b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModel.java @@ -164,7 +164,7 @@ private String toAnthropicSystemContext(Prompt prompt) { return prompt.getInstructions() .stream() .filter(m -> m.getMessageType() == MessageType.SYSTEM) - .map(Message::getContent) + .map(Message::getText) .collect(Collectors.joining(System.lineSeparator())); } @@ -179,7 +179,7 @@ private List toAnthropicMessages(Prompt prompt) { .stream() .filter(m -> m.getMessageType() == MessageType.USER || m.getMessageType() == MessageType.ASSISTANT) .map(message -> { - List contents = new ArrayList<>(List.of(new MediaContent(message.getContent()))); + List contents = new ArrayList<>(List.of(new MediaContent(message.getText()))); if (message instanceof UserMessage userMessage) { if (!CollectionUtils.isEmpty(userMessage.getMedia())) { List mediaContent = userMessage.getMedia() diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/BedrockAnthropicChatModelIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/BedrockAnthropicChatModelIT.java index 0ccd002d73e..c11bf0e0b20 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/BedrockAnthropicChatModelIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic/BedrockAnthropicChatModelIT.java @@ -79,7 +79,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); String joke2 = joke2Stream.collectList() .block() @@ -87,7 +87,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(joke1).isNotBlank(); @@ -105,7 +105,7 @@ void roleTest() { ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); } @Test @@ -123,7 +123,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = converter.convert(generation.getOutput().getContent()); + List list = converter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -142,7 +142,7 @@ void mapOutputConvert() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -164,7 +164,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConvert.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConvert.convert(generation.getOutput().getText()); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -190,7 +190,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModelIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModelIT.java index d2d906035f1..59bf29345d9 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModelIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/anthropic3/BedrockAnthropic3ChatModelIT.java @@ -82,7 +82,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); String joke2 = joke2Stream.collectList() .block() @@ -90,7 +90,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(joke1).isNotBlank(); @@ -108,7 +108,7 @@ void roleTest() { ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); } @Test @@ -126,7 +126,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -145,7 +145,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -166,7 +166,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -192,7 +192,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); @@ -211,8 +211,8 @@ void multiModalityTest() throws IOException { var response = this.chatModel.call(new Prompt(List.of(userMessage))); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple", "basket"); } @Test diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/cohere/BedrockCohereChatModelIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/cohere/BedrockCohereChatModelIT.java index 2dc38802a31..4702c6ca163 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/cohere/BedrockCohereChatModelIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/cohere/BedrockCohereChatModelIT.java @@ -77,7 +77,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); String joke2 = joke2Stream.collectList() .block() @@ -85,7 +85,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(joke1).isNotBlank(); @@ -102,7 +102,7 @@ void roleTest() { Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice)); Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); } @Test @@ -120,7 +120,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -139,7 +139,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -159,7 +159,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -185,7 +185,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/jurassic2/BedrockAi21Jurassic2ChatModelIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/jurassic2/BedrockAi21Jurassic2ChatModelIT.java index 9919e4b853a..1d0cb17fd59 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/jurassic2/BedrockAi21Jurassic2ChatModelIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/jurassic2/BedrockAi21Jurassic2ChatModelIT.java @@ -68,7 +68,7 @@ void roleTest() { ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); } @Test @@ -85,7 +85,7 @@ void testEmojiPenaltyFalse() { ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).matches(content -> content.contains("😄")); + assertThat(response.getResult().getOutput().getText()).matches(content -> content.contains("😄")); } @Test @@ -105,7 +105,7 @@ void emojiPenaltyWhenTrueByDefaultApplyPenaltyTest() { ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).doesNotContain("😄"); + assertThat(response.getResult().getOutput().getText()).doesNotContain("😄"); } @Test @@ -122,7 +122,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -138,7 +138,7 @@ void simpleChatResponse() { ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("AI"); + assertThat(response.getResult().getOutput().getText()).contains("AI"); } @SpringBootConfiguration diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/llama/BedrockLlamaChatModelIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/llama/BedrockLlamaChatModelIT.java index eadc7fce448..a7826ed8510 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/llama/BedrockLlamaChatModelIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/llama/BedrockLlamaChatModelIT.java @@ -75,7 +75,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); String joke2 = joke2Stream.collectList() .block() @@ -83,7 +83,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(joke1).isNotBlank(); @@ -104,7 +104,7 @@ void roleTest() { ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); } @Test @@ -122,7 +122,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -140,7 +140,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -161,7 +161,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -187,7 +187,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); diff --git a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/titan/BedrockTitanChatModelIT.java b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/titan/BedrockTitanChatModelIT.java index 40f674783e2..8f012288ec4 100644 --- a/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/titan/BedrockTitanChatModelIT.java +++ b/models/spring-ai-bedrock/src/test/java/org/springframework/ai/bedrock/titan/BedrockTitanChatModelIT.java @@ -76,7 +76,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); String joke2 = joke2Stream.collectList() .block() @@ -84,7 +84,7 @@ void multipleStreamAttempts() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(joke1).isNotBlank(); @@ -101,7 +101,7 @@ void roleTest() { Message systemMessage = systemPromptTemplate.createMessage(Map.of("name", name, "voice", voice)); Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); } @Test @@ -119,7 +119,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -139,7 +139,7 @@ void mapOutputConverter() { Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -160,7 +160,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -187,7 +187,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); diff --git a/models/spring-ai-huggingface/src/test/java/org/springframework/ai/huggingface/client/ClientIT.java b/models/spring-ai-huggingface/src/test/java/org/springframework/ai/huggingface/client/ClientIT.java index 94f6bd81f39..ce84e2a3d36 100644 --- a/models/spring-ai-huggingface/src/test/java/org/springframework/ai/huggingface/client/ClientIT.java +++ b/models/spring-ai-huggingface/src/test/java/org/springframework/ai/huggingface/client/ClientIT.java @@ -51,14 +51,14 @@ void helloWorldCompletion() { """; Prompt prompt = new Prompt(mistral7bInstruct); ChatResponse chatResponse = this.huggingfaceChatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); String expectedResponse = """ { "name": "John", "lastname": "Smith", "address": "#1 Samuel St." }"""; - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo(expectedResponse); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo(expectedResponse); assertThat(chatResponse.getResult().getOutput().getMetadata()).containsKey("generated_tokens"); assertThat(chatResponse.getResult().getOutput().getMetadata()).containsEntry("generated_tokens", 32); diff --git a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java index 93f7f5188c5..754dc77f589 100644 --- a/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java +++ b/models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/MiniMaxChatModel.java @@ -439,7 +439,7 @@ ChatCompletionRequest createRequest(Prompt prompt, boolean stream) { List chatCompletionMessages = prompt.getInstructions().stream().map(message -> { if (message.getMessageType() == MessageType.USER || message.getMessageType() == MessageType.SYSTEM) { - Object content = message.getContent(); + Object content = message.getText(); return List.of(new ChatCompletionMessage(content, ChatCompletionMessage.Role.valueOf(message.getMessageType().name()))); } @@ -452,7 +452,7 @@ else if (message.getMessageType() == MessageType.ASSISTANT) { return new ToolCall(toolCall.id(), toolCall.type(), function); }).toList(); } - return List.of(new ChatCompletionMessage(assistantMessage.getContent(), + return List.of(new ChatCompletionMessage(assistantMessage.getText(), ChatCompletionMessage.Role.ASSISTANT, null, null, toolCalls)); } else if (message.getMessageType() == MessageType.TOOL) { diff --git a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxRetryTests.java b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxRetryTests.java index 67910ecd829..720f30891e8 100644 --- a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxRetryTests.java +++ b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/api/MiniMaxRetryTests.java @@ -98,7 +98,7 @@ public void miniMaxChatTransientError() { var result = this.chatModel.call(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } @@ -126,7 +126,7 @@ public void miniMaxChatStreamTransientError() { var result = this.chatModel.stream(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.collectList().block().get(0).getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.collectList().block().get(0).getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } diff --git a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatModelObservationIT.java b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatModelObservationIT.java index e5cd810b82c..6110971ca8e 100644 --- a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatModelObservationIT.java +++ b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatModelObservationIT.java @@ -82,7 +82,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -111,7 +111,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java index fe083cd9de6..48127861619 100644 --- a/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java +++ b/models/spring-ai-minimax/src/test/java/org/springframework/ai/minimax/chat/MiniMaxChatOptionsTests.java @@ -59,7 +59,7 @@ void testMarkSensitiveInfo() { // markSensitiveInfo is enabled by default ChatResponse response = this.chatModel.call(new Prompt(messages)); - String responseContent = response.getResult().getOutput().getContent(); + String responseContent = response.getResult().getOutput().getText(); assertThat(responseContent).contains("133-**"); assertThat(responseContent).doesNotContain("133-12345678"); @@ -67,7 +67,7 @@ void testMarkSensitiveInfo() { var chatOptions = MiniMaxChatOptions.builder().withMaskSensitiveInfo(false).build(); ChatResponse unmaskResponse = this.chatModel.call(new Prompt(messages, chatOptions)); - String unmaskResponseContent = unmaskResponse.getResult().getOutput().getContent(); + String unmaskResponseContent = unmaskResponse.getResult().getOutput().getText(); assertThat(unmaskResponseContent).contains("133-12345678"); } @@ -97,7 +97,7 @@ void testWebSearch() { .build(); ChatResponse response = this.chatModel.call(new Prompt(messages, options)); - String responseContent = response.getResult().getOutput().getContent(); + String responseContent = response.getResult().getOutput().getText(); assertThat(responseContent).contains("40"); } @@ -132,7 +132,7 @@ void testWebSearchStream() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java index d3a509a431b..c7b967a5673 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiChatModel.java @@ -326,11 +326,11 @@ MistralAiApi.ChatCompletionRequest createRequest(Prompt prompt, boolean stream) List chatCompletionMessages = prompt.getInstructions().stream().map(message -> { if (message instanceof UserMessage userMessage) { - return List.of(new MistralAiApi.ChatCompletionMessage(userMessage.getContent(), + return List.of(new MistralAiApi.ChatCompletionMessage(userMessage.getText(), MistralAiApi.ChatCompletionMessage.Role.USER)); } else if (message instanceof SystemMessage systemMessage) { - return List.of(new MistralAiApi.ChatCompletionMessage(systemMessage.getContent(), + return List.of(new MistralAiApi.ChatCompletionMessage(systemMessage.getText(), MistralAiApi.ChatCompletionMessage.Role.SYSTEM)); } else if (message instanceof AssistantMessage assistantMessage) { @@ -342,7 +342,7 @@ else if (message instanceof AssistantMessage assistantMessage) { }).toList(); } - return List.of(new MistralAiApi.ChatCompletionMessage(assistantMessage.getContent(), + return List.of(new MistralAiApi.ChatCompletionMessage(assistantMessage.getText(), MistralAiApi.ChatCompletionMessage.Role.ASSISTANT, null, toolCalls, null)); } else if (message instanceof ToolResponseMessage toolResponseMessage) { diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java index 45e0b3dce63..d563907005a 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatClientIT.java @@ -70,7 +70,7 @@ void call() { logger.info("" + response); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -85,7 +85,7 @@ void testMessageHistory() { .call() .chatResponse(); // @formatter:on - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard"); // @formatter:off response = ChatClient.create(this.chatModel).prompt() @@ -96,7 +96,7 @@ void testMessageHistory() { // @formatter:on logger.info("" + response); - assertThat(response.getResult().getOutput().getContent().toLowerCase()).containsAnyOf("blackbeard", + assertThat(response.getResult().getOutput().getText().toLowerCase()).containsAnyOf("blackbeard", "bartholomew roberts"); } diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java index 10bbea59fec..b8a4ebdafa7 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelIT.java @@ -93,7 +93,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(systemMessage, userMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -111,7 +111,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -129,7 +129,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -148,7 +148,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -174,7 +174,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); @@ -204,7 +204,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("30.0", "30"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30"); } @Test @@ -231,7 +231,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelObservationIT.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelObservationIT.java index 3e95903e6a1..59f2f2a98f9 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelObservationIT.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatModelObservationIT.java @@ -79,7 +79,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -107,7 +107,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiRetryTests.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiRetryTests.java index 9432cfb7993..71982a390a6 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiRetryTests.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiRetryTests.java @@ -105,7 +105,7 @@ public void mistralAiChatTransientError() { var result = this.chatModel.call(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } @@ -134,7 +134,7 @@ public void mistralAiChatStreamTransientError() { var result = this.chatModel.stream(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.collectList().block().get(0).getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.collectList().block().get(0).getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } diff --git a/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java b/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java index 2443b144589..0d321996bc5 100644 --- a/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java +++ b/models/spring-ai-moonshot/src/main/java/org/springframework/ai/moonshot/MoonshotChatModel.java @@ -349,7 +349,7 @@ public MoonshotApi.ChatCompletionRequest createRequest(Prompt prompt, boolean st List chatCompletionMessages = prompt.getInstructions().stream().map(message -> { if (message.getMessageType() == MessageType.USER || message.getMessageType() == MessageType.SYSTEM) { - Object content = message.getContent(); + Object content = message.getText(); return List.of(new ChatCompletionMessage(content, ChatCompletionMessage.Role.valueOf(message.getMessageType().name()))); } @@ -362,7 +362,7 @@ else if (message.getMessageType() == MessageType.ASSISTANT) { return new ToolCall(toolCall.id(), toolCall.type(), function); }).toList(); } - return List.of(new ChatCompletionMessage(assistantMessage.getContent(), + return List.of(new ChatCompletionMessage(assistantMessage.getText(), ChatCompletionMessage.Role.ASSISTANT, null, null, toolCalls)); } else if (message.getMessageType() == MessageType.TOOL) { diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/MoonshotRetryTests.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/MoonshotRetryTests.java index 7ce54ee7256..dad1482866e 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/MoonshotRetryTests.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/MoonshotRetryTests.java @@ -91,7 +91,7 @@ public void moonshotChatTransientError() { var result = this.chatModel.call(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } @@ -119,7 +119,7 @@ public void moonshotChatStreamTransientError() { var result = this.chatModel.stream(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.collectList().block().get(0).getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.collectList().block().get(0).getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java index 400420671c4..eb8fdaf5e45 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelFunctionCallingIT.java @@ -74,7 +74,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -100,7 +100,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java index 83222c75d23..c177645b734 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelIT.java @@ -75,7 +75,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -93,7 +93,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -118,7 +118,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -137,7 +137,7 @@ void beanOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getText()); } @@ -162,7 +162,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -190,7 +190,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); diff --git a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelObservationIT.java b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelObservationIT.java index f345c1c5fce..1a2dda1e605 100644 --- a/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelObservationIT.java +++ b/models/spring-ai-moonshot/src/test/java/org/springframework/ai/moonshot/chat/MoonshotChatModelObservationIT.java @@ -82,7 +82,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -112,7 +112,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-oci-genai/src/main/java/org/springframework/ai/oci/cohere/OCICohereChatModel.java b/models/spring-ai-oci-genai/src/main/java/org/springframework/ai/oci/cohere/OCICohereChatModel.java index 4fcb82241f9..236b459d572 100644 --- a/models/spring-ai-oci-genai/src/main/java/org/springframework/ai/oci/cohere/OCICohereChatModel.java +++ b/models/spring-ai-oci-genai/src/main/java/org/springframework/ai/oci/cohere/OCICohereChatModel.java @@ -203,9 +203,9 @@ private List getCohereMessages(List messages) { for (int i = 1; i < messages.size(); i++) { Message message = messages.get(i); switch (message.getMessageType()) { - case USER -> chatHistory.add(CohereUserMessage.builder().message(message.getContent()).build()); - case ASSISTANT -> chatHistory.add(CohereChatBotMessage.builder().message(message.getContent()).build()); - case SYSTEM -> chatHistory.add(CohereSystemMessage.builder().message(message.getContent()).build()); + case USER -> chatHistory.add(CohereUserMessage.builder().message(message.getText()).build()); + case ASSISTANT -> chatHistory.add(CohereChatBotMessage.builder().message(message.getText()).build()); + case SYSTEM -> chatHistory.add(CohereSystemMessage.builder().message(message.getText()).build()); case TOOL -> { if (message instanceof ToolResponseMessage tm) { chatHistory.add(toToolMessage(tm)); @@ -237,7 +237,7 @@ private ChatRequest newChatRequest(OCICohereChatOptions options, Message message .documents(options.getDocuments()) .tools(options.getTools()) .chatHistory(chatHistory) - .message(message.getContent()) + .message(message.getText()) .build(); ServingMode servingMode = ServingModeHelper.get(options.getServingMode(), options.getModel()); ChatDetails chatDetails = ChatDetails.builder() diff --git a/models/spring-ai-oci-genai/src/test/java/org/springframework/ai/oci/cohere/OCICohereChatModelIT.java b/models/spring-ai-oci-genai/src/test/java/org/springframework/ai/oci/cohere/OCICohereChatModelIT.java index 13f465ff499..6ec9f91b5ff 100644 --- a/models/spring-ai-oci-genai/src/test/java/org/springframework/ai/oci/cohere/OCICohereChatModelIT.java +++ b/models/spring-ai-oci-genai/src/test/java/org/springframework/ai/oci/cohere/OCICohereChatModelIT.java @@ -54,7 +54,7 @@ void chatPrompt() { assertThat(response).isNotNull(); assertThat(response.getMetadata().getModel()).isEqualTo(CHAT_MODEL_ID); assertThat(response.getResult()).isNotNull(); - assertThat(response.getResult().getOutput().getContent()).isNotBlank(); + assertThat(response.getResult().getOutput().getText()).isNotBlank(); } } diff --git a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaChatModel.java b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaChatModel.java index 42227740886..421ebda1c93 100644 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaChatModel.java +++ b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaChatModel.java @@ -256,7 +256,7 @@ OllamaApi.ChatRequest ollamaChatRequest(Prompt prompt, boolean stream) { List ollamaMessages = prompt.getInstructions().stream().map(message -> { if (message instanceof UserMessage userMessage) { - var messageBuilder = OllamaApi.Message.builder(Role.USER).withContent(message.getContent()); + var messageBuilder = OllamaApi.Message.builder(Role.USER).withContent(message.getText()); if (!CollectionUtils.isEmpty(userMessage.getMedia())) { messageBuilder.withImages( userMessage.getMedia().stream().map(media -> this.fromMediaData(media.getData())).toList()); @@ -264,7 +264,7 @@ OllamaApi.ChatRequest ollamaChatRequest(Prompt prompt, boolean stream) { return List.of(messageBuilder.build()); } else if (message instanceof SystemMessage systemMessage) { - return List.of(OllamaApi.Message.builder(Role.SYSTEM).withContent(systemMessage.getContent()).build()); + return List.of(OllamaApi.Message.builder(Role.SYSTEM).withContent(systemMessage.getText()).build()); } else if (message instanceof AssistantMessage assistantMessage) { List toolCalls = null; @@ -276,7 +276,7 @@ else if (message instanceof AssistantMessage assistantMessage) { }).toList(); } return List.of(OllamaApi.Message.builder(Role.ASSISTANT) - .withContent(assistantMessage.getContent()) + .withContent(assistantMessage.getText()) .withToolCalls(toolCalls) .build()); } diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java index 5b819c64768..33e42820f51 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelFunctionCallingIT.java @@ -75,7 +75,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Disabled("Ollama API does not support streaming function calls yet") @@ -104,7 +104,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelIT.java index a5102586f7e..8cc3b4042f6 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelIT.java @@ -96,13 +96,13 @@ void roleTest() { Prompt prompt = new Prompt(List.of(systemMessage, userMessage), portableOptions); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); // ollama specific options var ollamaOptions = new OllamaOptions().withLowVRAM(true); response = this.chatModel.call(new Prompt(List.of(systemMessage, userMessage), ollamaOptions)); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); } @Test @@ -120,13 +120,13 @@ void testMessageHistory() { Prompt prompt = new Prompt(List.of(systemMessage, userMessage)); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard"); var promptWithMessageHistory = new Prompt(List.of(new UserMessage("Hello"), response.getResult().getOutput(), new UserMessage("Tell me just the names of those pirates."))); response = this.chatModel.call(promptWithMessageHistory); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard"); } @Test @@ -156,7 +156,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -175,7 +175,7 @@ void mapOutputConvert() { Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result).isNotNull(); assertThat((String) result.get("R")).containsIgnoringCase("red"); assertThat((String) result.get("G")).containsIgnoringCase("green"); @@ -195,7 +195,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -219,7 +219,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java index ee29deb67b5..2789b3a39df 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelMultimodalIT.java @@ -67,8 +67,8 @@ void multiModalityTest() { var response = this.chatModel.call(new Prompt(List.of(userMessage))); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); } @SpringBootConfiguration diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelObservationIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelObservationIT.java index 330ba7bcf61..2293122b6ee 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelObservationIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelObservationIT.java @@ -80,7 +80,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -111,7 +111,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java index ff0d28cc23c..0ced6764762 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/OpenAiChatModel.java @@ -449,11 +449,10 @@ ChatCompletionRequest createRequest(Prompt prompt, boolean stream) { List chatCompletionMessages = prompt.getInstructions().stream().map(message -> { if (message.getMessageType() == MessageType.USER || message.getMessageType() == MessageType.SYSTEM) { - Object content = message.getContent(); + Object content = message.getText(); if (message instanceof UserMessage userMessage) { if (!CollectionUtils.isEmpty(userMessage.getMedia())) { - List contentList = new ArrayList<>( - List.of(new MediaContent(message.getContent()))); + List contentList = new ArrayList<>(List.of(new MediaContent(message.getText()))); contentList.addAll(userMessage.getMedia().stream().map(this::mapToMediaContent).toList()); @@ -480,7 +479,7 @@ else if (message.getMessageType() == MessageType.ASSISTANT) { audioOutput = new AudioOutput(assistantMessage.getMedia().get(0).getId(), null, null, null); } - return List.of(new ChatCompletionMessage(assistantMessage.getContent(), + return List.of(new ChatCompletionMessage(assistantMessage.getText(), ChatCompletionMessage.Role.ASSISTANT, null, null, toolCalls, null, audioOutput)); } else if (message.getMessageType() == MessageType.TOOL) { diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java index 7d6f09d9f1b..257961689d8 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelFunctionCallingIT.java @@ -139,7 +139,7 @@ void functionCallTest(OpenAiChatOptions promptOptions) { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -207,7 +207,7 @@ void streamFunctionCallTest(OpenAiChatOptions promptOptions) { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java index be0425662bf..24277c087e8 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelIT.java @@ -89,7 +89,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); // needs fine tuning... evaluateQuestionAndAnswer(request, response, false); } @@ -102,13 +102,13 @@ void testMessageHistory() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); var promptWithMessageHistory = new Prompt(List.of(new UserMessage("Dummy"), response.getResult().getOutput(), new UserMessage("Repeat the last assistant message."))); response = this.chatModel.call(promptWithMessageHistory); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); } @Test @@ -121,7 +121,7 @@ void streamCompletenessTest() throws InterruptedException { CountDownLatch latch = new CountDownLatch(1); Flux chatResponseFlux = this.streamingChatModel.stream(prompt).doOnNext(chatResponse -> { - String responseContent = chatResponse.getResults().get(0).getOutput().getContent(); + String responseContent = chatResponse.getResults().get(0).getOutput().getText(); answer.append(responseContent); }).doOnComplete(() -> { logger.info(answer.toString()); @@ -146,7 +146,7 @@ void streamCompletenessTestWithChatResponse() throws InterruptedException { .stream() .chatResponse() .doOnNext(chatResponse -> { - String responseContent = chatResponse.getResults().get(0).getOutput().getContent(); + String responseContent = chatResponse.getResults().get(0).getOutput().getText(); answer.append(responseContent); }) .doOnComplete(() -> { @@ -197,7 +197,7 @@ void streamRoleTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); @@ -237,7 +237,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -256,7 +256,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -275,7 +275,7 @@ void beanOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getText()); } @Test @@ -292,7 +292,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -318,7 +318,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); @@ -347,9 +347,9 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("30.0", "30"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("10.0", "10"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("15.0", "15"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("10.0", "10"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("15.0", "15"); } @Test @@ -376,7 +376,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -424,9 +424,9 @@ void multiModalityEmbeddedImage(String modelName) throws IOException { var response = this.chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket", "fruit stand"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket", "fruit stand"); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -440,9 +440,9 @@ void multiModalityImageUrl(String modelName) throws IOException { ChatResponse response = this.chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket", "fruit stand"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket", "fruit stand"); } @Test @@ -461,7 +461,7 @@ void streamingMultiModalityImageUrl() throws IOException { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); @@ -480,8 +480,8 @@ void multiModalityOutputAudio(String modelName) throws IOException { .withOutputAudio(new AudioParameters(Voice.ALLOY, AudioResponseFormat.WAV)) .build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).isNotEmpty(); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).isNotEmpty(); byte[] audio = response.getResult().getOutput().getMedia().get(0).getDataAsByteArray(); assertThat(audio).isNotEmpty(); @@ -516,8 +516,8 @@ void multiModalityInputAudio(String modelName) { ChatResponse response = chatModel .call(new Prompt(List.of(userMessage), ChatOptionsBuilder.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).containsIgnoringCase("hobbits"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("hobbits"); assertThat(response.getMetadata().getModel()).containsIgnoringCase(modelName); } @@ -537,7 +537,7 @@ void streamingMultiModalityInputAudio(String modelName) { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); assertThat(content).containsIgnoringCase("hobbits"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelObservationIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelObservationIT.java index 54b33b47262..9d95097e5d1 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelObservationIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelObservationIT.java @@ -82,7 +82,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -113,7 +113,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java index acaca68361b..d64d467a8e0 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelProxyToolCallsIT.java @@ -188,7 +188,7 @@ void functionCall() throws JsonMappingException, JsonProcessingException { logger.info("Response: {}", chatResponse); - assertThat(chatResponse.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -220,7 +220,7 @@ void functionStream() throws JsonMappingException, JsonProcessingException { .collectList() .block() .stream() - .map(cr -> cr.getResult().getOutput().getContent()) + .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); logger.info("Response: {}", response); @@ -306,7 +306,7 @@ void functionCall2() throws JsonMappingException, JsonProcessingException { logger.info("Response: {}", chatResponse); - assertThat(chatResponse.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -341,7 +341,7 @@ void functionStream2() throws JsonMappingException, JsonProcessingException { String response = responses.collectList() .block() .stream() - .map(cr -> cr.getResult().getOutput().getContent()) + .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); logger.info("Response: {}", response); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java index bb0db5ce3a2..3cc512ee0e7 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelResponseFormatIT.java @@ -89,7 +89,7 @@ void jsonObject() throws JsonMappingException, JsonProcessingException { assertThat(response).isNotNull(); - String content = response.getResult().getOutput().getContent(); + String content = response.getResult().getOutput().getText(); logger.info("Response content: {}", content); @@ -132,7 +132,7 @@ void jsonSchema() throws JsonMappingException, JsonProcessingException { assertThat(response).isNotNull(); - String content = response.getResult().getOutput().getContent(); + String content = response.getResult().getOutput().getText(); logger.info("Response content: {}", content); @@ -213,7 +213,7 @@ record Items(@JsonProperty(required = true, value = "explanation") String explan assertThat(response).isNotNull(); - String content = response.getResult().getOutput().getContent(); + String content = response.getResult().getOutput().getText(); logger.info("Response content: {}", content); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java index 443c65c7980..1831095ab63 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiChatModelTypeReferenceBeanOutputConverterIT.java @@ -62,7 +62,7 @@ void typeRefOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + List actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms).hasSize(2); assertThat(actorsFilms.get(0).actor()).isEqualTo("Tom Hanks"); @@ -94,7 +94,7 @@ void typeRefStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); List actorsFilms = outputConverter.convert(generationTextFromStream); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiCompatibleChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiCompatibleChatModelIT.java index 997fb02c3a7..fa7e938ca85 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiCompatibleChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiCompatibleChatModelIT.java @@ -78,7 +78,7 @@ void chatCompletion(ChatModel chatModel) { ChatResponse response = chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @ParameterizedTest @@ -94,7 +94,7 @@ void streamCompletion(StreamingChatModel streamingChatModel) { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java index 9e63ef28157..587d26f61fb 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/OpenAiRetryTests.java @@ -140,7 +140,7 @@ public void openAiChatTransientError() { var result = this.chatModel.call(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } @@ -169,7 +169,7 @@ public void openAiChatStreamTransientError() { var result = this.chatModel.stream(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.collectList().block().get(0).getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.collectList().block().get(0).getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java index 4241bdd20b8..fd77f37e2b8 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientIT.java @@ -113,7 +113,7 @@ void call() { logger.info("" + response); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -232,7 +232,7 @@ void beanStreamOutputConverterRecords() { String generationTextFromStream = chatResponses .stream() .filter(cr -> cr.getResult() != null) - .map(cr -> cr.getResult().getOutput().getContent()) + .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); // @formatter:on diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java index b02892a5138..d3338b7ce72 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/client/OpenAiChatClientProxyFunctionCallsIT.java @@ -179,7 +179,7 @@ void toolProxyFunctionCall() throws JsonMappingException, JsonProcessingExceptio logger.info("Response: {}", chatResponse); - assertThat(chatResponse.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(chatResponse.getResult().getOutput().getText()).contains("30", "10", "15"); } } diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java index 856aa847bdf..9962b611604 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/GroqWithOpenAiChatModelIT.java @@ -90,7 +90,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -109,7 +109,7 @@ void streamRoleTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); @@ -150,7 +150,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -169,7 +169,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -188,7 +188,7 @@ void beanOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.getActor()).isNotEmpty(); } @@ -206,7 +206,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -232,7 +232,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); @@ -260,7 +260,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -287,7 +287,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -307,9 +307,9 @@ void multiModalityEmbeddedImage(String modelName) throws IOException { var response = this.chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket"); } @Disabled("Groq does not support multi modality API") @@ -324,9 +324,9 @@ void multiModalityImageUrl(String modelName) throws IOException { ChatResponse response = this.chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket"); } @Disabled("Groq does not support multi modality API") @@ -345,7 +345,7 @@ void streamingMultiModalityImageUrl() throws IOException { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java index 75fb99d6e69..74ecc805374 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/MistralWithOpenAiChatModelIT.java @@ -89,7 +89,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -108,7 +108,7 @@ void streamRoleTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); @@ -149,7 +149,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -168,7 +168,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -187,7 +187,7 @@ void beanOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.getActor()).isNotEmpty(); } @@ -205,7 +205,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -231,7 +231,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); @@ -262,7 +262,7 @@ void functionCallTest(String modelName) { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -291,7 +291,7 @@ void streamFunctionCallTest(String modelName) { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -311,9 +311,9 @@ void multiModalityEmbeddedImage(String modelName) throws IOException { var response = this.chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket"); } @Disabled("Mistral AI does not support multi modality API") @@ -328,9 +328,9 @@ void multiModalityImageUrl(String modelName) throws IOException { ChatResponse response = this.chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket"); } @Disabled("Mistral AI does not support multi modality API") @@ -349,7 +349,7 @@ void streamingMultiModalityImageUrl() throws IOException { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java index a8e8d7b41c3..158f231a857 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/NvidiaWithOpenAiChatModelIT.java @@ -87,7 +87,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -106,7 +106,7 @@ void streamRoleTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); @@ -146,7 +146,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -165,7 +165,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -184,7 +184,7 @@ void beanOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.getActor()).isNotEmpty(); } @@ -202,7 +202,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -228,7 +228,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .filter(c -> c != null) .collect(Collectors.joining()); @@ -257,7 +257,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -284,7 +284,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java index 77983755451..000d126476a 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/OllamaWithOpenAiChatModelIT.java @@ -107,7 +107,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -126,7 +126,7 @@ void streamRoleTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); @@ -167,7 +167,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -186,7 +186,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -205,7 +205,7 @@ void beanOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.getActor()).isNotEmpty(); } @@ -223,7 +223,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -249,7 +249,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); @@ -279,7 +279,7 @@ void functionCallTest(String modelName) { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Disabled("Ollama API does not support streaming function calls yet") @@ -306,7 +306,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -325,9 +325,9 @@ void multiModalityEmbeddedImage(String modelName) throws IOException { var response = this.chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket"); } @Disabled("Not supported by the current Ollama API") @@ -342,9 +342,9 @@ void multiModalityImageUrl(String modelName) throws IOException { ChatResponse response = this.chatModel .call(new Prompt(List.of(userMessage), OpenAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket"); } @Disabled("Not supported by the current Ollama API") @@ -365,7 +365,7 @@ void streamingMultiModalityImageUrl(String modelName) throws IOException { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java index be8f088ac4a..cb2bdf8faa5 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/proxy/PerplexityWithOpenAiChatModelIT.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.stream.Collectors; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.slf4j.Logger; @@ -102,7 +101,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(systemMessage, userMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -123,7 +122,7 @@ void streamRoleTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); @@ -162,7 +161,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -180,7 +179,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -197,7 +196,7 @@ void beanOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getText()); assertThat(actorsFilms.getActor()).isNotEmpty(); } @@ -214,7 +213,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -239,7 +238,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .filter(c -> c != null) .collect(Collectors.joining()); @@ -293,7 +292,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java index e12bb25c49e..90a0de6b674 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/testutils/AbstractIT.java @@ -84,7 +84,7 @@ public abstract class AbstractIT { protected void evaluateQuestionAndAnswer(String question, ChatResponse response, boolean factBased) { assertThat(response).isNotNull(); - String answer = response.getResult().getOutput().getContent(); + String answer = response.getResult().getOutput().getText(); logger.info("Question: " + question); logger.info("Answer:" + answer); PromptTemplate userPromptTemplate = new PromptTemplate(this.userEvaluatorResource, @@ -98,12 +98,12 @@ protected void evaluateQuestionAndAnswer(String question, ChatResponse response, } Message userMessage = userPromptTemplate.createMessage(); Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); - String yesOrNo = this.chatModel.call(prompt).getResult().getOutput().getContent(); + String yesOrNo = this.chatModel.call(prompt).getResult().getOutput().getText(); logger.info("Is Answer related to question: " + yesOrNo); if (yesOrNo.equalsIgnoreCase("no")) { SystemMessage notRelatedSystemMessage = new SystemMessage(this.qaEvaluatorNotRelatedResource); prompt = new Prompt(List.of(userMessage, notRelatedSystemMessage)); - String reasonForFailure = this.chatModel.call(prompt).getResult().getOutput().getContent(); + String reasonForFailure = this.chatModel.call(prompt).getResult().getOutput().getText(); fail(reasonForFailure); } else { diff --git a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java index 944a1c4e1f0..074655b5e72 100644 --- a/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java +++ b/models/spring-ai-qianfan/src/main/java/org/springframework/ai/qianfan/QianFanChatModel.java @@ -246,7 +246,7 @@ private ChatCompletion toChatCompletion(ChatCompletionChunk chunk) { public ChatCompletionRequest createRequest(Prompt prompt, boolean stream) { var chatCompletionMessages = prompt.getInstructions() .stream() - .map(m -> new ChatCompletionMessage(m.getContent(), + .map(m -> new ChatCompletionMessage(m.getText(), ChatCompletionMessage.Role.valueOf(m.getMessageType().name()))) .toList(); var systemMessageList = chatCompletionMessages.stream().filter(msg -> msg.role() == Role.SYSTEM).toList(); diff --git a/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/api/QianFanRetryTests.java b/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/api/QianFanRetryTests.java index 7e7c1dac7bc..b3a12d26467 100644 --- a/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/api/QianFanRetryTests.java +++ b/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/api/QianFanRetryTests.java @@ -104,7 +104,7 @@ public void qianFanChatTransientError() { var result = this.chatClient.call(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } @@ -130,7 +130,7 @@ public void qianFanChatStreamTransientError() { var result = this.chatClient.stream(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(Objects.requireNonNull(result.collectList().block()).get(0).getResult().getOutput().getContent()) + assertThat(Objects.requireNonNull(result.collectList().block()).get(0).getResult().getOutput().getText()) .isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); diff --git a/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/chat/QianFanChatModelIT.java b/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/chat/QianFanChatModelIT.java index f8bb6ef6995..7fc69dcbc3b 100644 --- a/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/chat/QianFanChatModelIT.java +++ b/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/chat/QianFanChatModelIT.java @@ -68,7 +68,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); } @Test @@ -87,7 +87,7 @@ void streamRoleTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); diff --git a/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/chat/QianFanChatModelObservationIT.java b/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/chat/QianFanChatModelObservationIT.java index 9d0ebc6d98d..44292f74588 100644 --- a/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/chat/QianFanChatModelObservationIT.java +++ b/models/spring-ai-qianfan/src/test/java/org/springframework/ai/qianfan/chat/QianFanChatModelObservationIT.java @@ -83,7 +83,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -112,7 +112,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java b/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java index b13efe0dd95..bb77ed4390d 100644 --- a/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java +++ b/models/spring-ai-vertex-ai-embedding/src/main/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModel.java @@ -51,7 +51,6 @@ import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.MultimodalInstanceBuilder; import org.springframework.ai.vertexai.embedding.VertexAiEmbeddingUtils.VideoBuilder; import org.springframework.util.Assert; -import org.springframework.util.CollectionUtils; import org.springframework.util.MimeType; import org.springframework.util.MimeTypeUtils; import org.springframework.util.StringUtils; @@ -149,44 +148,42 @@ private EmbeddingResponse doSingleDocumentPrediction(PredictionServiceClient cli new DocumentMetadata(document.getId(), MimeTypeUtils.TEXT_PLAIN, document.getContent())); } - if (!CollectionUtils.isEmpty(document.getMedia())) { - - for (Media media : document.getMedia()) { - if (media.getMimeType().isCompatibleWith(TEXT_MIME_TYPE)) { - instanceBuilder.withText(media.getData().toString()); - documentMetadata.put(ModalityType.TEXT, - new DocumentMetadata(document.getId(), MimeTypeUtils.TEXT_PLAIN, media.getData())); - if (StringUtils.hasText(document.getContent())) { - logger.warn("Media type String overrides the Document text content!"); - } - } - else if (media.getMimeType().isCompatibleWith(IMAGE_MIME_TYPE)) { - if (SUPPORTED_IMAGE_MIME_SUB_TYPES.contains(media.getMimeType())) { - instanceBuilder - .withImage(ImageBuilder.of(media.getMimeType()).withImageData(media.getData()).build()); - documentMetadata.put(ModalityType.IMAGE, - new DocumentMetadata(document.getId(), media.getMimeType(), media.getData())); - } - else { - logger.warn("Unsupported image mime type: {}", media.getMimeType()); - throw new IllegalArgumentException("Unsupported image mime type: " + media.getMimeType()); - } + Media media = document.getMedia(); + if (media != null) { + if (media.getMimeType().isCompatibleWith(TEXT_MIME_TYPE)) { + instanceBuilder.withText(media.getData().toString()); + documentMetadata.put(ModalityType.TEXT, + new DocumentMetadata(document.getId(), MimeTypeUtils.TEXT_PLAIN, media.getData())); + if (StringUtils.hasText(document.getContent())) { + logger.warn("Media type String overrides the Document text content!"); } - else if (media.getMimeType().isCompatibleWith(VIDEO_MIME_TYPE)) { - instanceBuilder.withVideo(VideoBuilder.of(media.getMimeType()) - .withVideoData(media.getData()) - .withStartOffsetSec(mergedOptions.getVideoStartOffsetSec()) - .withEndOffsetSec(mergedOptions.getVideoEndOffsetSec()) - .withIntervalSec(mergedOptions.getVideoIntervalSec()) - .build()); - documentMetadata.put(ModalityType.VIDEO, + } + else if (media.getMimeType().isCompatibleWith(IMAGE_MIME_TYPE)) { + if (SUPPORTED_IMAGE_MIME_SUB_TYPES.contains(media.getMimeType())) { + instanceBuilder + .withImage(ImageBuilder.of(media.getMimeType()).withImageData(media.getData()).build()); + documentMetadata.put(ModalityType.IMAGE, new DocumentMetadata(document.getId(), media.getMimeType(), media.getData())); } else { - logger.warn("Unsupported media type: {}", media.getMimeType()); - throw new IllegalArgumentException("Unsupported media type: " + media.getMimeType()); + logger.warn("Unsupported image mime type: {}", media.getMimeType()); + throw new IllegalArgumentException("Unsupported image mime type: " + media.getMimeType()); } } + else if (media.getMimeType().isCompatibleWith(VIDEO_MIME_TYPE)) { + instanceBuilder.withVideo(VideoBuilder.of(media.getMimeType()) + .withVideoData(media.getData()) + .withStartOffsetSec(mergedOptions.getVideoStartOffsetSec()) + .withEndOffsetSec(mergedOptions.getVideoEndOffsetSec()) + .withIntervalSec(mergedOptions.getVideoIntervalSec()) + .build()); + documentMetadata.put(ModalityType.VIDEO, + new DocumentMetadata(document.getId(), media.getMimeType(), media.getData())); + } + else { + logger.warn("Unsupported media type: {}", media.getMimeType()); + throw new IllegalArgumentException("Unsupported media type: " + media.getMimeType()); + } } List instances = List.of(VertexAiEmbeddingUtils.valueOf(instanceBuilder.build())); diff --git a/models/spring-ai-vertex-ai-embedding/src/test/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModelIT.java b/models/spring-ai-vertex-ai-embedding/src/test/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModelIT.java index ef6016356aa..5545203f01a 100644 --- a/models/spring-ai-vertex-ai-embedding/src/test/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModelIT.java +++ b/models/spring-ai-vertex-ai-embedding/src/test/java/org/springframework/ai/vertexai/embedding/multimodal/VertexAiMultimodalEmbeddingModelIT.java @@ -186,7 +186,7 @@ void videoEmbedding() { void textImageAndVideoEmbedding() { var document = Document.builder() - .content("Hello World") + .text("Hello World") .media(new Media(MimeTypeUtils.IMAGE_PNG, new ClassPathResource("/test.image.png"))) .media(new Media(new MimeType("video", "mp4"), new ClassPathResource("/test.video.mp4"))) .build(); diff --git a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java index d7b7abab414..7601ca35ad8 100644 --- a/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java +++ b/models/spring-ai-vertex-ai-gemini/src/main/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModel.java @@ -186,16 +186,16 @@ static List messageToGeminiParts(Message message) { List parts = new ArrayList<>(); - if (systemMessage.getContent() != null) { - parts.add(Part.newBuilder().setText(systemMessage.getContent()).build()); + if (systemMessage.getText() != null) { + parts.add(Part.newBuilder().setText(systemMessage.getText()).build()); } return parts; } else if (message instanceof UserMessage userMessage) { List parts = new ArrayList<>(); - if (userMessage.getContent() != null) { - parts.add(Part.newBuilder().setText(userMessage.getContent()).build()); + if (userMessage.getText() != null) { + parts.add(Part.newBuilder().setText(userMessage.getText()).build()); } parts.addAll(mediaToParts(userMessage.getMedia())); @@ -204,8 +204,8 @@ else if (message instanceof UserMessage userMessage) { } else if (message instanceof AssistantMessage assistantMessage) { List parts = new ArrayList<>(); - if (StringUtils.hasText(assistantMessage.getContent())) { - parts.add(Part.newBuilder().setText(assistantMessage.getContent()).build()); + if (StringUtils.hasText(assistantMessage.getText())) { + parts.add(Part.newBuilder().setText(assistantMessage.getText()).build()); } if (!CollectionUtils.isEmpty(assistantMessage.getToolCalls())) { parts.addAll(assistantMessage.getToolCalls() diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiChatModelObservationIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiChatModelObservationIT.java index e34963c5971..3905212a652 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiChatModelObservationIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiChatModelObservationIT.java @@ -76,7 +76,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -104,7 +104,7 @@ void observationForStreamingOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java index 7e7f095e94c..bfae7cccbd8 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiChatModelIT.java @@ -69,27 +69,27 @@ class VertexAiGeminiChatModelIT { void roleTest() { Prompt prompt = createPrompt(VertexAiGeminiChatOptions.builder().build()); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); } @Test void testMessageHistory() { Prompt prompt = createPrompt(VertexAiGeminiChatOptions.builder().build()); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); var promptWithMessageHistory = new Prompt(List.of(new UserMessage("Dummy"), prompt.getInstructions().get(1), response.getResult().getOutput(), new UserMessage("Repeat the last assistant message."))); response = this.chatModel.call(promptWithMessageHistory); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); } @Test void googleSearchTool() { Prompt prompt = createPrompt(VertexAiGeminiChatOptions.builder().withGoogleSearchRetrieval(true).build()); ChatResponse response = this.chatModel.call(prompt); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Blackbeard", "Bartholomew"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Blackbeard", "Bartholomew"); } @NotNull @@ -119,7 +119,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = converter.convert(generation.getOutput().getContent()); + List list = converter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -137,7 +137,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -157,7 +157,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConvert.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConvert.convert(generation.getOutput().getText()); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); } @@ -173,7 +173,7 @@ void textStream() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); // logger.info("" + actorsFilms); @@ -201,7 +201,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); @@ -224,7 +224,7 @@ void multiModalityTest() throws IOException { // I see a bunch of bananas in a golden basket. The bananas are ripe and yellow. // There are also some red apples in the basket. The basket is sitting on a table. // The background is a blurred light blue color.' - assertThat(response.getResult().getOutput().getContent()).satisfies(content -> { + assertThat(response.getResult().getOutput().getText()).satisfies(content -> { long count = Stream.of("bananas", "apple", "basket").filter(content::contains).count(); assertThat(count).isGreaterThanOrEqualTo(2); }); @@ -258,7 +258,7 @@ void multiModalityPdfTest() throws IOException { var response = this.chatModel.call(new Prompt(List.of(userMessage))); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("Spring AI", "portable API"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("Spring AI", "portable API"); } record ActorsFilmsRecord(String actor, List movies) { diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiRetryTests.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiRetryTests.java index 2e646082fac..a69f7ed96af 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiRetryTests.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/VertexAiGeminiRetryTests.java @@ -101,7 +101,7 @@ public void vertexAiGeminiChatTransientError() throws IOException { // Assertions assertThat(result).isNotNull(); - assertThat(result.getResult().getOutput().getContent()).isEqualTo("Response"); + assertThat(result.getResult().getOutput().getText()).isEqualTo("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } diff --git a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java index a9eea815d61..c4328726270 100644 --- a/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java +++ b/models/spring-ai-vertex-ai-gemini/src/test/java/org/springframework/ai/vertexai/gemini/function/VertexAiGeminiChatModelFunctionCallingIT.java @@ -95,7 +95,7 @@ public void functionCallExplicitOpenApiSchema() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); } @Test @@ -127,14 +127,14 @@ public void functionCallTestInferredOpenApiSchema() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("15.0", "15"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("15.0", "15"); ChatResponse response2 = this.chatModel .call(new Prompt("What is the payment status for transaction 696?", promptOptions)); logger.info("Response: {}", response2); - assertThat(response2.getResult().getOutput().getContent()).containsIgnoringCase("transaction 696 is PAYED"); + assertThat(response2.getResult().getOutput().getText()).containsIgnoringCase("transaction 696 is PAYED"); } @@ -168,14 +168,14 @@ public void functionCallTestInferredOpenApiSchema2() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); ChatResponse response2 = this.chatModel .call(new Prompt("What is the payment status for transaction 696?", promptOptions)); logger.info("Response: {}", response2); - assertThat(response2.getResult().getOutput().getContent()).containsIgnoringCase("transaction 696 is PAYED"); + assertThat(response2.getResult().getOutput().getText()).containsIgnoringCase("transaction 696 is PAYED"); } @@ -205,7 +205,7 @@ public void functionCallTestInferredOpenApiSchemaStream() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", responseString); diff --git a/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/utils/MessageToPromptConverter.java b/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/utils/MessageToPromptConverter.java index 8f23b766ba3..c527c7efbc1 100644 --- a/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/utils/MessageToPromptConverter.java +++ b/models/spring-ai-watsonx-ai/src/main/java/org/springframework/ai/watsonx/utils/MessageToPromptConverter.java @@ -55,7 +55,7 @@ public String toPrompt(List messages) { final String systemMessages = messages.stream() .filter(message -> message.getMessageType() == MessageType.SYSTEM) - .map(Message::getContent) + .map(Message::getText) .collect(Collectors.joining("\n")); final String userMessages = messages.stream() @@ -70,11 +70,11 @@ public String toPrompt(List messages) { protected String messageToString(Message message) { switch (message.getMessageType()) { case SYSTEM: - return message.getContent(); + return message.getText(); case USER: - return this.humanPrompt + message.getContent(); + return this.humanPrompt + message.getText(); case ASSISTANT: - return this.assistantPrompt + message.getContent(); + return this.assistantPrompt + message.getText(); case TOOL: throw new IllegalArgumentException(TOOL_EXECUTION_NOT_SUPPORTED_FOR_WAI_MODELS); } diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java index c9a18206ee6..6adac855999 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiChatModel.java @@ -359,11 +359,10 @@ ChatCompletionRequest createRequest(Prompt prompt, boolean stream) { List chatCompletionMessages = prompt.getInstructions().stream().map(message -> { if (message.getMessageType() == MessageType.USER || message.getMessageType() == MessageType.SYSTEM) { - Object content = message.getContent(); + Object content = message.getText(); if (message instanceof UserMessage userMessage) { if (!CollectionUtils.isEmpty(userMessage.getMedia())) { - List contentList = new ArrayList<>( - List.of(new MediaContent(message.getContent()))); + List contentList = new ArrayList<>(List.of(new MediaContent(message.getText()))); contentList.addAll(userMessage.getMedia() .stream() @@ -387,7 +386,7 @@ else if (message.getMessageType() == MessageType.ASSISTANT) { return new ToolCall(toolCall.id(), toolCall.type(), function); }).toList(); } - return List.of(new ChatCompletionMessage(assistantMessage.getContent(), + return List.of(new ChatCompletionMessage(assistantMessage.getText(), ChatCompletionMessage.Role.ASSISTANT, null, null, toolCalls)); } else if (message.getMessageType() == MessageType.TOOL) { diff --git a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiRetryTests.java b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiRetryTests.java index 713351fab99..a2cdea7e5e1 100644 --- a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiRetryTests.java +++ b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/api/ZhiPuAiRetryTests.java @@ -112,7 +112,7 @@ public void zhiPuAiChatTransientError() { var result = this.chatModel.call(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } @@ -140,7 +140,7 @@ public void zhiPuAiChatStreamTransientError() { var result = this.chatModel.stream(new Prompt("text")); assertThat(result).isNotNull(); - assertThat(result.collectList().block().get(0).getResult().getOutput().getContent()).isSameAs("Response"); + assertThat(result.collectList().block().get(0).getResult().getOutput().getText()).isSameAs("Response"); assertThat(this.retryListener.onSuccessRetryCount).isEqualTo(2); assertThat(this.retryListener.onErrorRetryCount).isEqualTo(2); } diff --git a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java index b5f035e3182..a4180ce7ec6 100644 --- a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java +++ b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelIT.java @@ -89,7 +89,7 @@ void roleTest() { Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResults()).hasSize(1); - assertThat(response.getResults().get(0).getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResults().get(0).getOutput().getText()).contains("Blackbeard"); // needs fine tuning... evaluateQuestionAndAnswer(request, response, false); } @@ -109,7 +109,7 @@ void streamRoleTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); @@ -131,7 +131,7 @@ void listOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - List list = outputConverter.convert(generation.getOutput().getContent()); + List list = outputConverter.convert(generation.getOutput().getText()); assertThat(list).hasSize(5); } @@ -150,7 +150,7 @@ void mapOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - Map result = outputConverter.convert(generation.getOutput().getContent()); + Map result = outputConverter.convert(generation.getOutput().getText()); assertThat(result.get("numbers")).isEqualTo(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9)); } @@ -169,7 +169,7 @@ void beanOutputConverter() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilms actorsFilms = outputConverter.convert(generation.getOutput().getText()); } @Test @@ -186,7 +186,7 @@ void beanOutputConverterRecords() { Prompt prompt = new Prompt(promptTemplate.createMessage()); Generation generation = this.chatModel.call(prompt).getResult(); - ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getContent()); + ActorsFilmsRecord actorsFilms = outputConverter.convert(generation.getOutput().getText()); logger.info("" + actorsFilms); assertThat(actorsFilms.actor()).isEqualTo("Tom Hanks"); assertThat(actorsFilms.movies()).hasSize(5); @@ -211,7 +211,7 @@ void beanStreamOutputConverterRecords() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); ActorsFilmsRecord actorsFilms = outputConverter.convert(generationTextFromStream); @@ -241,9 +241,9 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("30.0", "30"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("10.0", "10"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("15.0", "15"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("30.0", "30"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("10.0", "10"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("15.0", "15"); } @Test @@ -270,7 +270,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -291,9 +291,9 @@ void multiModalityEmbeddedImage(String modelName) throws IOException { var response = this.chatModel .call(new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket"); } @ParameterizedTest(name = "{0} : {displayName} ") @@ -307,9 +307,9 @@ void multiModalityImageUrl(String modelName) throws IOException { ChatResponse response = this.chatModel .call(new Prompt(List.of(userMessage), ZhiPuAiChatOptions.builder().withModel(modelName).build())); - logger.info(response.getResult().getOutput().getContent()); - assertThat(response.getResult().getOutput().getContent()).contains("bananas", "apple"); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("bowl", "basket"); + logger.info(response.getResult().getOutput().getText()); + assertThat(response.getResult().getOutput().getText()).contains("bananas", "apple"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("bowl", "basket"); } @Test @@ -327,7 +327,7 @@ void streamingMultiModalityImageUrl() throws IOException { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); assertThat(content).contains("bananas", "apple"); diff --git a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelObservationIT.java b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelObservationIT.java index 65c88d8b47f..63ea779cb0a 100644 --- a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelObservationIT.java +++ b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/chat/ZhiPuAiChatModelObservationIT.java @@ -80,7 +80,7 @@ void observationForChatOperation() { Prompt prompt = new Prompt("Why does a raven look like a desk?", options); ChatResponse chatResponse = this.chatModel.call(prompt); - assertThat(chatResponse.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(chatResponse.getResult().getOutput().getText()).isNotEmpty(); ChatResponseMetadata responseMetadata = chatResponse.getMetadata(); assertThat(responseMetadata).isNotNull(); @@ -108,7 +108,7 @@ void observationForStreamingChatOperation() { String aggregatedResponse = responses.subList(0, responses.size() - 1) .stream() - .map(r -> r.getResult().getOutput().getContent()) + .map(r -> r.getResult().getOutput().getText()) .collect(Collectors.joining()); assertThat(aggregatedResponse).isNotEmpty(); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java index 10b7d07c8d0..182f4b3be4d 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java @@ -115,8 +115,8 @@ private static AdvisedRequest toAdvisedRequest(DefaultChatClientRequestSpec inpu Message lastMessage = messages.get(messages.size() - 1); if (lastMessage.getMessageType() == MessageType.USER) { UserMessage userMessage = (UserMessage) lastMessage; - if (StringUtils.hasText(userMessage.getContent())) { - userText = lastMessage.getContent(); + if (StringUtils.hasText(userMessage.getText())) { + userText = lastMessage.getText(); } Collection messageMedia = userMessage.getMedia(); if (!CollectionUtils.isEmpty(messageMedia)) { @@ -493,10 +493,10 @@ private ChatResponse doGetChatResponse(DefaultChatClientRequestSpec inputRequest @Nullable private static String getContentFromChatResponse(@Nullable ChatResponse chatResponse) { if (chatResponse == null || chatResponse.getResult() == null || chatResponse.getResult().getOutput() == null - || chatResponse.getResult().getOutput().getContent() == null) { + || chatResponse.getResult().getOutput().getText() == null) { return null; } - return chatResponse.getResult().getOutput().getContent(); + return chatResponse.getResult().getOutput().getText(); } @Override @@ -562,10 +562,10 @@ public Flux chatResponse() { public Flux content() { return doGetObservableFluxChatResponse(this.request).map(r -> { if (r.getResult() == null || r.getResult().getOutput() == null - || r.getResult().getOutput().getContent() == null) { + || r.getResult().getOutput().getText() == null) { return ""; } - return r.getResult().getOutput().getContent(); + return r.getResult().getOutput().getText(); }).filter(StringUtils::hasLength); } @@ -1005,11 +1005,11 @@ public DefaultCallPromptResponseSpec(ChatModel chatModel, Prompt prompt) { } public String content() { - return doGetChatResponse(this.prompt).getResult().getOutput().getContent(); + return doGetChatResponse(this.prompt).getResult().getOutput().getText(); } public List contents() { - return doGetChatResponse(this.prompt).getResults().stream().map(r -> r.getOutput().getContent()).toList(); + return doGetChatResponse(this.prompt).getResults().stream().map(r -> r.getOutput().getText()).toList(); } public ChatResponse chatResponse() { @@ -1046,10 +1046,10 @@ private Flux doGetFluxChatResponse(Prompt prompt) { public Flux content() { return doGetFluxChatResponse(this.prompt).map(r -> { if (r.getResult() == null || r.getResult().getOutput() == null - || r.getResult().getOutput().getContent() == null) { + || r.getResult().getOutput().getText() == null) { return ""; } - return r.getResult().getOutput().getContent(); + return r.getResult().getOutput().getText(); }).filter(StringUtils::hasLength); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java index 2989fa64ce1..07e76e27c1c 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/PromptChatMemoryAdvisor.java @@ -111,7 +111,7 @@ private AdvisedRequest before(AdvisedRequest request) { String memory = (memoryMessages != null) ? memoryMessages.stream() .filter(m -> m.getMessageType() == MessageType.USER || m.getMessageType() == MessageType.ASSISTANT) - .map(m -> m.getMessageType() + ":" + ((Content) m).getContent()) + .map(m -> m.getMessageType() + ":" + ((Content) m).getText()) .collect(Collectors.joining(System.lineSeparator())) : ""; Map advisedSystemParams = new HashMap<>(request.systemParams()); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/VectorStoreChatMemoryAdvisor.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/VectorStoreChatMemoryAdvisor.java index ffc1bd6dd62..3873417eb17 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/VectorStoreChatMemoryAdvisor.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/client/advisor/VectorStoreChatMemoryAdvisor.java @@ -16,7 +16,6 @@ package org.springframework.ai.chat.client.advisor; -import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -35,7 +34,6 @@ import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.model.MessageAggregator; import org.springframework.ai.document.Document; -import org.springframework.ai.model.Content; import org.springframework.ai.vectorstore.SearchRequest; import org.springframework.ai.vectorstore.VectorStore; import org.springframework.util.StringUtils; @@ -188,15 +186,16 @@ private List toDocuments(List messages, String conversationId metadata.put(DOCUMENT_METADATA_MESSAGE_TYPE, message.getMessageType().name()); if (message instanceof UserMessage userMessage) { return Document.builder() - .content(userMessage.getContent()) - // userMessage.getMedia().get(0).getId() - //TODO vector store for memory would not store this into the vector store, could store an 'id' instead - // .media(userMessage.getMedia()) + .text(userMessage.getText()) + // userMessage.getMedia().get(0).getId() + // TODO vector store for memory would not store this into the + // vector store, could store an 'id' instead + // .media(userMessage.getMedia()) .metadata(metadata) .build(); } else if (message instanceof AssistantMessage assistantMessage) { - return Document.builder().content(assistantMessage.getContent()).metadata(metadata).build(); + return Document.builder().text(assistantMessage.getText()).metadata(metadata).build(); } throw new RuntimeException("Unknown message type: " + message.getMessageType()); }) diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java index aff40fa4a0f..8f3dd228510 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java @@ -98,7 +98,7 @@ protected AbstractMessage(MessageType messageType, Resource resource, Map aggregate(Flux fluxChatResponse, && chatResponse.getResult().getMetadata() != ChatGenerationMetadata.NULL) { generationMetadataRef.set(chatResponse.getResult().getMetadata()); } - if (chatResponse.getResult().getOutput().getContent() != null) { - messageTextContentRef.get().append(chatResponse.getResult().getOutput().getContent()); + if (chatResponse.getResult().getOutput().getText() != null) { + messageTextContentRef.get().append(chatResponse.getResult().getOutput().getText()); } if (chatResponse.getResult().getOutput().getMetadata() != null) { messageMetadataMapRef.get().putAll(chatResponse.getResult().getOutput().getMetadata()); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/StreamingChatModel.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/model/StreamingChatModel.java index 9105add8c36..57a23da1878 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/StreamingChatModel.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/model/StreamingChatModel.java @@ -30,15 +30,15 @@ public interface StreamingChatModel extends StreamingModel default Flux stream(String message) { Prompt prompt = new Prompt(message); return stream(prompt).map(response -> (response.getResult() == null || response.getResult().getOutput() == null - || response.getResult().getOutput().getContent() == null) ? "" - : response.getResult().getOutput().getContent()); + || response.getResult().getOutput().getText() == null) ? "" + : response.getResult().getOutput().getText()); } default Flux stream(Message... messages) { Prompt prompt = new Prompt(Arrays.asList(messages)); return stream(prompt).map(response -> (response.getResult() == null || response.getResult().getOutput() == null - || response.getResult().getOutput().getContent() == null) ? "" - : response.getResult().getOutput().getContent()); + || response.getResult().getOutput().getText() == null) ? "" + : response.getResult().getOutput().getText()); } @Override diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContentProcessor.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContentProcessor.java index 3de4a321532..382d4881743 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContentProcessor.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContentProcessor.java @@ -37,7 +37,7 @@ public static List prompt(ChatModelObservationContext context) { return List.of(); } - return context.getRequest().getInstructions().stream().map(Content::getContent).toList(); + return context.getRequest().getInstructions().stream().map(Content::getText).toList(); } public static List completion(ChatModelObservationContext context) { @@ -46,7 +46,7 @@ public static List completion(ChatModelObservationContext context) { return List.of(); } - if (!StringUtils.hasText(context.getResponse().getResult().getOutput().getContent())) { + if (!StringUtils.hasText(context.getResponse().getResult().getOutput().getText())) { return List.of(); } @@ -54,8 +54,8 @@ public static List completion(ChatModelObservationContext context) { .getResults() .stream() .filter(generation -> generation.getOutput() != null - && StringUtils.hasText(generation.getOutput().getContent())) - .map(generation -> generation.getOutput().getContent()) + && StringUtils.hasText(generation.getOutput().getText())) + .map(generation -> generation.getOutput().getText()) .toList(); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/Prompt.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/Prompt.java index deb35cb9b17..3140901c058 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/Prompt.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/Prompt.java @@ -75,7 +75,7 @@ public Prompt(List messages, ChatOptions chatOptions) { public String getContents() { StringBuilder sb = new StringBuilder(); for (Message message : getInstructions()) { - sb.append(message.getContent()); + sb.append(message.getText()); } return sb.toString(); } @@ -119,14 +119,13 @@ private List instructionsCopy() { List messagesCopy = new ArrayList<>(); this.messages.forEach(message -> { if (message instanceof UserMessage userMessage) { - messagesCopy - .add(new UserMessage(userMessage.getContent(), userMessage.getMedia(), message.getMetadata())); + messagesCopy.add(new UserMessage(userMessage.getText(), userMessage.getMedia(), message.getMetadata())); } else if (message instanceof SystemMessage systemMessage) { - messagesCopy.add(new SystemMessage(systemMessage.getContent())); + messagesCopy.add(new SystemMessage(systemMessage.getText())); } else if (message instanceof AssistantMessage assistantMessage) { - messagesCopy.add(new AssistantMessage(assistantMessage.getContent(), assistantMessage.getMetadata(), + messagesCopy.add(new AssistantMessage(assistantMessage.getText(), assistantMessage.getMetadata(), assistantMessage.getToolCalls())); } else if (message instanceof ToolResponseMessage toolResponseMessage) { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/document/Document.java b/spring-ai-core/src/main/java/org/springframework/ai/document/Document.java index 5c690bca930..3a1df9b2f86 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/document/Document.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/document/Document.java @@ -16,7 +16,6 @@ package org.springframework.ai.document; -import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Objects; @@ -37,7 +36,48 @@ * A document is a container for the content and metadata of a document. It also contains * the document's unique ID and an optional embedding. * - * Either string based text or Media is the content. + * A Document can hold either text content or media content, but not both. This ensures + * clear content type handling and processing. + * + * It is intended to be used to take data from external sources as part of spring-ai's ETL + * pipeline and create an embedding for the text or media and store that embedding in a + * vector database. + * + *

+ * Example of creating a text document:

{@code
+ * // Using constructor
+ * Document textDoc = new Document("Sample text content", Map.of("source", "user-input"));
+ *
+ * // Using builder
+ * Document textDoc = Document.builder()
+ *     .text("Sample text content")
+ *     .metadata("source", "user-input")
+ *     .build();
+ * }
+ * + *

+ * Example of creating a media document:

{@code
+ * // Using constructor
+ * Media imageContent = new Media(MediaType.IMAGE_PNG, new byte[] {...});
+ * Document mediaDoc = new Document(imageContent, Map.of("filename", "sample.png"));
+ *
+ * // Using builder
+ * Document mediaDoc = Document.builder()
+ *     .media(new Media(MediaType.IMAGE_PNG, new byte[] {...}))
+ *     .metadata("filename", "sample.png")
+ *     .build();
+ * }
+ * + *

+ * Example of checking content type and accessing content:

{@code
+ * if (document.isText()) {
+ *     String textContent = document.getText();
+ *     // Process text content
+ * } else {
+ *     Media mediaContent = document.getMedia();
+ *     // Process media content
+ * }
+ * }
*/ @JsonIgnoreProperties({ "contentFormatter" }) public class Document { @@ -66,9 +106,18 @@ public class Document { private final Map metadata; /** - * Measure of similarity between the document embedding and the query vector. The - * higher the score, the more they are similar. It's the opposite of the distance - * measure. + * A numeric score associated with this document that can represent various types of + * relevance measures. + *

+ * Common uses include: + *

    + *
  • Measure of similarity between the document embedding and a query vector, where + * higher scores indicate greater similarity (opposite of distance measure) + *
  • Text relevancy rankings from retrieval systems + *
  • Custom relevancy metrics from RAG patterns + *
+ *

+ * Higher values typically indicate greater relevance or similarity. */ @Nullable private final Double score; @@ -106,18 +155,13 @@ public Document(String id, Media media, Map metadata) { this(id, null, media, metadata, null); } - private Document(String id, String text, Media media, Map metadata, @Nullable Double score) { Assert.hasText(id, "id cannot be null or empty"); Assert.notNull(metadata, "metadata cannot be null"); Assert.noNullElements(metadata.keySet(), "metadata cannot have null keys"); Assert.noNullElements(metadata.values(), "metadata cannot have null values"); - if (text == null && media == null) { - throw new IllegalArgumentException("need to specify either text or media"); - } - if (text != null && media != null) { - throw new IllegalArgumentException("can not specify both text and media"); - } + Assert.isTrue(text != null ^ media != null, "exactly one of text or media must be specified"); + this.id = id; this.text = text; this.media = media; @@ -125,50 +169,58 @@ private Document(String id, String text, Media media, Map metada this.score = score; } - - - /** - * @deprecated Use builder instead: {@link Document#builder()}. - */ - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Document(String id, Media media, - Map metadata, @Nullable Double score) { - Assert.hasText(id, "id cannot be null or empty"); - Assert.notNull(media, "media cannot be null"); - Assert.notNull(metadata, "metadata cannot be null"); - Assert.noNullElements(metadata.keySet(), "metadata cannot have null keys"); - Assert.noNullElements(metadata.values(), "metadata cannot have null values"); - - this.id = id; - this.text = null; - this.media = media; - this.metadata = Collections.unmodifiableMap(metadata); - this.score = score; - } - - public static Builder builder() { return new Builder(); } + /** + * Returns the unique identifier for this document. + *

+ * This ID is either explicitly provided during document creation or generated using + * the configured {@link IdGenerator} (defaults to {@link RandomIdGenerator}). + * @return the unique identifier of this document + * @see RandomIdGenerator + */ public String getId() { return this.id; } + /** + * @deprecated Use getText() instead as it more accurately reflects the content type + */ @Deprecated public String getContent() { return this.getText(); } + /** + * Returns the document's text content, if any. + * @return the text content if {@link #isText()} is true, null otherwise + * @see #isText() + * @see #getMedia() + */ + @Nullable public String getText() { return this.text; } + /** + * Determines whether this document contains text or media content. + * @return true if this document contains text content (accessible via + * {@link #getText()}), false if it contains media content (accessible via + * {@link #getMedia()}) + */ public boolean isText() { return this.text != null; } - + /** + * Returns the document's media content, if any. + * @return the media content if {@link #isText()} is false, null otherwise + * @see #isText() + * @see #getText() + */ + @Nullable public Media getMedia() { return this.media; } @@ -192,7 +244,13 @@ public String getFormattedContent(ContentFormatter formatter, MetadataMode metad return formatter.format(this, metadataMode); } - + /** + * Returns the metadata associated with this document. + *

+ * The metadata values are restricted to simple types (string, int, float, boolean) + * for compatibility with Vector Databases. + * @return the metadata map + */ public Map getMetadata() { return this.metadata; } @@ -239,11 +297,7 @@ public void setContentFormatter(ContentFormatter contentFormatter) { } public Builder mutate() { - return new Builder().id(this.id) - .content(this.text) - .media(this.media) - .metadata(this.metadata) - .score(this.score); + return new Builder().id(this.id).text(this.text).media(this.media).metadata(this.metadata).score(this.score); } @Override @@ -264,7 +318,7 @@ public int hashCode() { @Override public String toString() { - return "Document{" + "id='" + this.id + '\'' + ", content='" + this.text + '\'' + return "Document{" + "id='" + this.id + '\'' + ", text='" + this.text + '\'' + ", media='" + this.media + '\'' + ", metadata=" + this.metadata + ", score=" + this.score + '}'; } @@ -297,76 +351,90 @@ public Builder id(String id) { return this; } - public Builder text(String text) { + /** + * Sets the text content of the document. + *

+ * Either text or media content must be set before building the document, but not + * both. + * @param text the text content + * @return the builder instance + * @see #media(Media) + */ + public Builder text(@Nullable String text) { this.text = text; return this; } - public Builder content(String text) { + /** + * Sets the text content of the document. + * @param text the text content to set + * @return the builder instance + * @deprecated since 1.0.0-M5, use {@link #text(String)} instead as it more + * accurately reflects that this Document instance will contain text rather than + * generic content. This method will be removed in a future release. + */ + @Deprecated(since = "1.0.0-M5", forRemoval = true) + public Builder content(@Nullable String text) { this.text = text; return this; } - public Builder media(Media media) { + /** + * Sets the media content of the document. + *

+ * Either text or media content must be set before building the document, but not + * both. + * @param media the media content + * @return the builder instance + * @see #text(String) + */ + public Builder media(@Nullable Media media) { this.media = media; return this; } - public Builder metadata(Map metadata) { + Assert.notNull(metadata, "metadata cannot be null"); this.metadata = metadata; return this; } public Builder metadata(String key, Object value) { + Assert.notNull(key, "metadata key cannot be null"); + Assert.notNull(value, "metadata value cannot be null"); this.metadata.put(key, value); return this; } public Builder embedding(float[] embedding) { + Assert.notNull(embedding, "embedding cannot be null"); this.embedding = embedding; return this; } + /** + * Sets a score value for this document. + *

+ * Common uses include: + *

    + *
  • Measure of similarity between the document embedding and a query vector, + * where higher scores indicate greater similarity (opposite of distance measure) + *
  • Text relevancy rankings from retrieval systems + *
  • Custom relevancy metrics from RAG patterns + *
+ *

+ * Higher values typically indicate greater relevance or similarity. + * @param score the document score, may be null + * @return the builder instance + */ public Builder score(@Nullable Double score) { this.score = score; return this; } - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Builder withIdGenerator(IdGenerator idGenerator) { - return idGenerator(idGenerator); - } - - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Builder withId(String id) { - return id(id); - } - - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Builder withContent(String content) { - return content(content); - } - - - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Builder withMedia(Media media) { - return media(media); - } - - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Builder withMetadata(Map metadata) { - return metadata(metadata); - } - - @Deprecated(since = "1.0.0-M5", forRemoval = true) - public Builder withMetadata(String key, Object value) { - return metadata(key, value); - } - public Document build() { if (!StringUtils.hasText(this.id)) { - this.id = this.idGenerator.generateId(this.text, this.metadata); // TODO Review if metadata should be included + this.id = this.idGenerator.generateId(this.text, this.metadata); } var document = new Document(this.id, this.text, this.media, this.metadata, this.score); document.setEmbedding(this.embedding); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/evaluation/Evaluator.java b/spring-ai-core/src/main/java/org/springframework/ai/evaluation/Evaluator.java index 9b12205d3dd..927b97acb19 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/evaluation/Evaluator.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/evaluation/Evaluator.java @@ -30,7 +30,7 @@ public interface Evaluator { default String doGetSupportingData(EvaluationRequest evaluationRequest) { List data = evaluationRequest.getDataList(); return data.stream() - .map(Content::getContent) + .map(Content::getText) .filter(StringUtils::hasText) .collect(Collectors.joining(System.lineSeparator())); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/Content.java b/spring-ai-core/src/main/java/org/springframework/ai/model/Content.java index b5e8fa2a522..1496d89a069 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/Content.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/Content.java @@ -33,7 +33,7 @@ public interface Content { * Get the content of the message. * @return the content of the message */ - String getContent(); // TODO consider getText + String getText(); /** * Get the metadata associated with the content. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/Media.java b/spring-ai-core/src/main/java/org/springframework/ai/model/Media.java index f829d39763c..f04fde901f2 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/Media.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/model/Media.java @@ -111,7 +111,6 @@ public byte[] getDataAsByteArray() { } } - /** * Get the media id * @return the media id diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tokenizer/JTokkitTokenCountEstimator.java b/spring-ai-core/src/main/java/org/springframework/ai/tokenizer/JTokkitTokenCountEstimator.java index 760a9a4b345..b5f0523d83e 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tokenizer/JTokkitTokenCountEstimator.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/tokenizer/JTokkitTokenCountEstimator.java @@ -56,8 +56,8 @@ public int estimate(String text) { public int estimate(MediaContent content) { int tokenCount = 0; - if (content.getContent() != null) { - tokenCount += this.estimate(content.getContent()); + if (content.getText() != null) { + tokenCount += this.estimate(content.getText()); } if (!CollectionUtils.isEmpty(content.getMedia())) { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/transformer/KeywordMetadataEnricher.java b/spring-ai-core/src/main/java/org/springframework/ai/transformer/KeywordMetadataEnricher.java index dd02b336bb4..ff5a4a5d1ef 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/transformer/KeywordMetadataEnricher.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/transformer/KeywordMetadataEnricher.java @@ -65,7 +65,7 @@ public List apply(List documents) { var template = new PromptTemplate(String.format(KEYWORDS_TEMPLATE, this.keywordCount)); Prompt prompt = template.create(Map.of(CONTEXT_STR_PLACEHOLDER, document.getContent())); - String keywords = this.chatModel.call(prompt).getResult().getOutput().getContent(); + String keywords = this.chatModel.call(prompt).getResult().getOutput().getText(); document.getMetadata().putAll(Map.of(EXCERPT_KEYWORDS_METADATA_KEY, keywords)); } return documents; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/transformer/SummaryMetadataEnricher.java b/spring-ai-core/src/main/java/org/springframework/ai/transformer/SummaryMetadataEnricher.java index a1537828285..4f1fe394dd5 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/transformer/SummaryMetadataEnricher.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/transformer/SummaryMetadataEnricher.java @@ -97,7 +97,7 @@ public List apply(List documents) { Prompt prompt = new PromptTemplate(this.summaryTemplate) .create(Map.of(CONTEXT_STR_PLACEHOLDER, documentContext)); - documentSummaries.add(this.chatModel.call(prompt).getResult().getOutput().getContent()); + documentSummaries.add(this.chatModel.call(prompt).getResult().getOutput().getText()); } for (int i = 0; i < documentSummaries.size(); i++) { diff --git a/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStoreContent.java b/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStoreContent.java index 2d1590f681d..cc3aa8e7db4 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStoreContent.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/vectorstore/SimpleVectorStoreContent.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Objects; +import com.fasterxml.jackson.annotation.JsonAlias; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; @@ -41,7 +42,7 @@ public final class SimpleVectorStoreContent implements Content { private final String id; - private final String content; + private final String text; private final Map metadata; @@ -50,55 +51,56 @@ public final class SimpleVectorStoreContent implements Content { /** * Creates a new instance with the given content, empty metadata, and embedding * vector. - * @param content the content text, must not be null + * @param text the content text, must not be null * @param embedding the embedding vector, must not be null */ @JsonCreator(mode = JsonCreator.Mode.PROPERTIES) - public SimpleVectorStoreContent(@JsonProperty("content") String content, + public SimpleVectorStoreContent( + @JsonProperty("text") @JsonAlias({"content"}) String text, @JsonProperty("embedding") float[] embedding) { - this(content, new HashMap<>(), embedding); + this(text, new HashMap<>(), embedding); } /** * Creates a new instance with the given content, metadata, and embedding vector. - * @param content the content text, must not be null + * @param text the content text, must not be null * @param metadata the metadata map, must not be null * @param embedding the embedding vector, must not be null */ - public SimpleVectorStoreContent(String content, Map metadata, float[] embedding) { - this(content, metadata, new RandomIdGenerator(), embedding); + public SimpleVectorStoreContent(String text, Map metadata, float[] embedding) { + this(text, metadata, new RandomIdGenerator(), embedding); } /** * Creates a new instance with the given content, metadata, custom ID generator, and * embedding vector. - * @param content the content text, must not be null + * @param text the content text, must not be null * @param metadata the metadata map, must not be null * @param idGenerator the ID generator to use, must not be null * @param embedding the embedding vector, must not be null */ - public SimpleVectorStoreContent(String content, Map metadata, IdGenerator idGenerator, + public SimpleVectorStoreContent(String text, Map metadata, IdGenerator idGenerator, float[] embedding) { - this(idGenerator.generateId(content, metadata), content, metadata, embedding); + this(idGenerator.generateId(text, metadata), text, metadata, embedding); } /** * Creates a new instance with all fields specified. * @param id the unique identifier, must not be empty - * @param content the content text, must not be null + * @param text the content text, must not be null * @param metadata the metadata map, must not be null * @param embedding the embedding vector, must not be null * @throws IllegalArgumentException if any parameter is null or if id is empty */ - public SimpleVectorStoreContent(String id, String content, Map metadata, float[] embedding) { + public SimpleVectorStoreContent(String id, String text, Map metadata, float[] embedding) { Assert.hasText(id, "id must not be null or empty"); - Assert.notNull(content, "content must not be null"); + Assert.notNull(text, "content must not be null"); Assert.notNull(metadata, "metadata must not be null"); Assert.notNull(embedding, "embedding must not be null"); Assert.isTrue(embedding.length > 0, "embedding vector must not be empty"); this.id = id; - this.content = content; + this.text = text; this.metadata = Collections.unmodifiableMap(new HashMap<>(metadata)); this.embedding = Arrays.copyOf(embedding, embedding.length); } @@ -112,7 +114,7 @@ public SimpleVectorStoreContent(String id, String content, Map m public SimpleVectorStoreContent withEmbedding(float[] embedding) { Assert.notNull(embedding, "embedding must not be null"); Assert.isTrue(embedding.length > 0, "embedding vector must not be empty"); - return new SimpleVectorStoreContent(this.id, this.content, this.metadata, embedding); + return new SimpleVectorStoreContent(this.id, this.text, this.metadata, embedding); } public String getId() { @@ -120,8 +122,8 @@ public String getId() { } @Override - public String getContent() { - return this.content; + public String getText() { + return this.text; } @Override @@ -140,7 +142,7 @@ public float[] getEmbedding() { public Document toDocument(Double score) { var metadata = new HashMap<>(this.metadata); metadata.put(DocumentMetadata.DISTANCE.value(), 1.0 - score); - return Document.builder().id(this.id).content(this.content).metadata(metadata).score(score).build(); + return Document.builder().id(this.id).text(this.text).metadata(metadata).score(score).build(); } @Override @@ -152,14 +154,14 @@ public boolean equals(Object o) { return false; } SimpleVectorStoreContent that = (SimpleVectorStoreContent) o; - return Objects.equals(this.id, that.id) && Objects.equals(this.content, that.content) + return Objects.equals(this.id, that.id) && Objects.equals(this.text, that.text) && Objects.equals(this.metadata, that.metadata) && Arrays.equals(this.embedding, that.embedding); } @Override public int hashCode() { int result = Objects.hashCode(this.id); - result = 31 * result + Objects.hashCode(this.content); + result = 31 * result + Objects.hashCode(this.text); result = 31 * result + Objects.hashCode(this.metadata); result = 31 * result + Arrays.hashCode(this.embedding); return result; @@ -167,8 +169,8 @@ public int hashCode() { @Override public String toString() { - return "SimpleVectorStoreContent{" + "id='" + this.id + '\'' + ", content='" + this.content + '\'' - + ", metadata=" + this.metadata + ", embedding=" + Arrays.toString(this.embedding) + '}'; + return "SimpleVectorStoreContent{" + "id='" + this.id + '\'' + ", content='" + this.text + '\'' + ", metadata=" + + this.metadata + ", embedding=" + Arrays.toString(this.embedding) + '}'; } } diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/ChatModelTests.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/ChatModelTests.java index 27568b6be17..37440e83642 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/ChatModelTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/ChatModelTests.java @@ -53,7 +53,7 @@ void generateWithStringCallsGenerateWithPromptAndReturnsResponseCorrectly() { ChatModel mockClient = Mockito.mock(ChatModel.class); AssistantMessage mockAssistantMessage = Mockito.mock(AssistantMessage.class); - given(mockAssistantMessage.getContent()).willReturn(responseMessage); + given(mockAssistantMessage.getText()).willReturn(responseMessage); // Create a mock Generation Generation generation = Mockito.mock(Generation.class); @@ -84,7 +84,7 @@ void generateWithStringCallsGenerateWithPromptAndReturnsResponseCorrectly() { verify(mockClient, times(1)).call(isA(Prompt.class)); verify(response, times(1)).getResult(); verify(generation, times(1)).getOutput(); - verify(mockAssistantMessage, times(1)).getContent(); + verify(mockAssistantMessage, times(1)).getText(); verifyNoMoreInteractions(mockClient, generation, response); } diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientAdvisorTests.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientAdvisorTests.java index 07d77ecb1cd..cbfc5791010 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientAdvisorTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientAdvisorTests.java @@ -85,11 +85,11 @@ public void promptChatMemory() { ChatResponse chatResponse = chatClient.prompt().user("my name is John").call().chatResponse(); - String content = chatResponse.getResult().getOutput().getContent(); + String content = chatResponse.getResult().getOutput().getText(); assertThat(content).isEqualTo("Hello John"); Message systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualToIgnoringWhitespace(""" + assertThat(systemMessage.getText()).isEqualToIgnoringWhitespace(""" Default system text. Use the conversation memory from the MEMORY section to provide accurate answers. @@ -101,14 +101,14 @@ public void promptChatMemory() { assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); Message userMessage = this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualToIgnoringWhitespace("my name is John"); + assertThat(userMessage.getText()).isEqualToIgnoringWhitespace("my name is John"); content = chatClient.prompt().user("What is my name?").call().content(); assertThat(content).isEqualTo("Your name is John"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualToIgnoringWhitespace(""" + assertThat(systemMessage.getText()).isEqualToIgnoringWhitespace(""" Default system text. Use the conversation memory from the MEMORY section to provide accurate answers. @@ -122,7 +122,7 @@ public void promptChatMemory() { assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); userMessage = this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualToIgnoringWhitespace("What is my name?"); + assertThat(userMessage.getText()).isEqualToIgnoringWhitespace("What is my name?"); } @Test @@ -154,7 +154,7 @@ public void streamingPromptChatMemory() { assertThat(content).isEqualTo("Hello John"); Message systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualToIgnoringWhitespace(""" + assertThat(systemMessage.getText()).isEqualToIgnoringWhitespace(""" Default system text. Use the conversation memory from the MEMORY section to provide accurate answers. @@ -166,14 +166,14 @@ public void streamingPromptChatMemory() { assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); Message userMessage = this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualToIgnoringWhitespace("my name is John"); + assertThat(userMessage.getText()).isEqualToIgnoringWhitespace("my name is John"); content = join(chatClient.prompt().user("What is my name?").stream().content()); assertThat(content).isEqualTo("Your name is John"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualToIgnoringWhitespace(""" + assertThat(systemMessage.getText()).isEqualToIgnoringWhitespace(""" Default system text. Use the conversation memory from the MEMORY section to provide accurate answers. @@ -187,7 +187,7 @@ public void streamingPromptChatMemory() { assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); userMessage = this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualToIgnoringWhitespace("What is my name?"); + assertThat(userMessage.getText()).isEqualToIgnoringWhitespace("What is my name?"); } } diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientResponseEntityTests.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientResponseEntityTests.java index a5038f32a4c..4dfc4a0a82f 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientResponseEntityTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientResponseEntityTests.java @@ -77,7 +77,7 @@ public void responseEntityTest() { Message userMessage = this.promptCaptor.getValue().getInstructions().get(0); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).contains("Tell me about John"); + assertThat(userMessage.getText()).contains("Tell me about John"); } @Test @@ -107,7 +107,7 @@ public void parametrizedResponseEntityTest() { Message userMessage = this.promptCaptor.getValue().getInstructions().get(0); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).contains("Tell me about them"); + assertThat(userMessage.getText()).contains("Tell me about them"); } @Test @@ -132,7 +132,7 @@ public void customSoCResponseEntityTest() { Message userMessage = this.promptCaptor.getValue().getInstructions().get(0); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).contains("Tell me about Max"); + assertThat(userMessage.getText()).contains("Tell me about Max"); } record MyBean(String name, int age) { diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientTest.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientTest.java index b596efd3bd1..1254ec5db01 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientTest.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/ChatClientTest.java @@ -91,7 +91,7 @@ void defaultSystemText() { assertThat(content).isEqualTo("response"); Message systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Default system text"); + assertThat(systemMessage.getText()).isEqualTo("Default system text"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); content = join(chatClient.prompt("What's Spring AI?").stream().content()); @@ -99,7 +99,7 @@ void defaultSystemText() { assertThat(content).isEqualTo("response"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Default system text"); + assertThat(systemMessage.getText()).isEqualTo("Default system text"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); // Override the default system text with prompt system @@ -107,7 +107,7 @@ void defaultSystemText() { assertThat(content).isEqualTo("response"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Override default system text"); + assertThat(systemMessage.getText()).isEqualTo("Override default system text"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); // Streaming @@ -116,7 +116,7 @@ void defaultSystemText() { assertThat(content).isEqualTo("response"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Override default system text"); + assertThat(systemMessage.getText()).isEqualTo("Override default system text"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); } @@ -144,7 +144,7 @@ void defaultSystemTextLambda() { assertThat(content).isEqualTo("response"); Message systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Default system text value1, value2"); + assertThat(systemMessage.getText()).isEqualTo("Default system text value1, value2"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); // Streaming @@ -153,7 +153,7 @@ void defaultSystemTextLambda() { assertThat(content).isEqualTo("response"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Default system text value1, value2"); + assertThat(systemMessage.getText()).isEqualTo("Default system text value1, value2"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); // Override single default system parameter @@ -161,7 +161,7 @@ void defaultSystemTextLambda() { assertThat(content).isEqualTo("response"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Default system text value1New, value2"); + assertThat(systemMessage.getText()).isEqualTo("Default system text value1New, value2"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); // streaming @@ -170,7 +170,7 @@ void defaultSystemTextLambda() { assertThat(content).isEqualTo("response"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Default system text value1New, value2"); + assertThat(systemMessage.getText()).isEqualTo("Default system text value1New, value2"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); // Override default system text @@ -181,7 +181,7 @@ void defaultSystemTextLambda() { assertThat(content).isEqualTo("response"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Override default system text value3"); + assertThat(systemMessage.getText()).isEqualTo("Override default system text value3"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); // Streaming @@ -192,7 +192,7 @@ void defaultSystemTextLambda() { assertThat(content).isEqualTo("response"); systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("Override default system text value3"); + assertThat(systemMessage.getText()).isEqualTo("Override default system text value3"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); } @@ -239,11 +239,11 @@ void mutateDefaults() { Message systemMessage = prompt.getInstructions().get(0); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); - assertThat(systemMessage.getContent()).isEqualTo("Default system text value1, value2"); + assertThat(systemMessage.getText()).isEqualTo("Default system text value1, value2"); UserMessage userMessage = (UserMessage) prompt.getInstructions().get(1); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).isEqualTo("Default user text value1, value2"); + assertThat(userMessage.getText()).isEqualTo("Default user text value1, value2"); assertThat(userMessage.getMedia()).hasSize(1); assertThat(userMessage.getMedia().iterator().next().getMimeType()).isEqualTo(MimeTypeUtils.IMAGE_JPEG); @@ -261,11 +261,11 @@ void mutateDefaults() { systemMessage = prompt.getInstructions().get(0); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); - assertThat(systemMessage.getContent()).isEqualTo("Default system text value1, value2"); + assertThat(systemMessage.getText()).isEqualTo("Default system text value1, value2"); userMessage = (UserMessage) prompt.getInstructions().get(1); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).isEqualTo("Default user text value1, value2"); + assertThat(userMessage.getText()).isEqualTo("Default user text value1, value2"); assertThat(userMessage.getMedia()).hasSize(1); assertThat(userMessage.getMedia().iterator().next().getMimeType()).isEqualTo(MimeTypeUtils.IMAGE_JPEG); @@ -291,11 +291,11 @@ void mutateDefaults() { systemMessage = prompt.getInstructions().get(0); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); - assertThat(systemMessage.getContent()).isEqualTo("Mutated default system text value1, value2"); + assertThat(systemMessage.getText()).isEqualTo("Mutated default system text value1, value2"); userMessage = (UserMessage) prompt.getInstructions().get(1); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).isEqualTo("Mutated default user text value1, value2"); + assertThat(userMessage.getText()).isEqualTo("Mutated default user text value1, value2"); assertThat(userMessage.getMedia()).hasSize(1); assertThat(userMessage.getMedia().iterator().next().getMimeType()).isEqualTo(MimeTypeUtils.IMAGE_JPEG); @@ -313,11 +313,11 @@ void mutateDefaults() { systemMessage = prompt.getInstructions().get(0); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); - assertThat(systemMessage.getContent()).isEqualTo("Mutated default system text value1, value2"); + assertThat(systemMessage.getText()).isEqualTo("Mutated default system text value1, value2"); userMessage = (UserMessage) prompt.getInstructions().get(1); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).isEqualTo("Mutated default user text value1, value2"); + assertThat(userMessage.getText()).isEqualTo("Mutated default user text value1, value2"); assertThat(userMessage.getMedia()).hasSize(1); assertThat(userMessage.getMedia().iterator().next().getMimeType()).isEqualTo(MimeTypeUtils.IMAGE_JPEG); @@ -377,11 +377,11 @@ void mutatePrompt() { Message systemMessage = prompt.getInstructions().get(0); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); - assertThat(systemMessage.getContent()).isEqualTo("New default system text value1, value2"); + assertThat(systemMessage.getText()).isEqualTo("New default system text value1, value2"); UserMessage userMessage = (UserMessage) prompt.getInstructions().get(1); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).isEqualTo("Default user text userValue1, userValue2"); + assertThat(userMessage.getText()).isEqualTo("Default user text userValue1, userValue2"); assertThat(userMessage.getMedia()).hasSize(1); assertThat(userMessage.getMedia().iterator().next().getMimeType()).isEqualTo(MimeTypeUtils.IMAGE_JPEG); @@ -408,11 +408,11 @@ void mutatePrompt() { systemMessage = prompt.getInstructions().get(0); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); - assertThat(systemMessage.getContent()).isEqualTo("New default system text value1, value2"); + assertThat(systemMessage.getText()).isEqualTo("New default system text value1, value2"); userMessage = (UserMessage) prompt.getInstructions().get(1); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).isEqualTo("Default user text userValue1, userValue2"); + assertThat(userMessage.getText()).isEqualTo("Default user text userValue1, userValue2"); assertThat(userMessage.getMedia()).hasSize(1); assertThat(userMessage.getMedia().iterator().next().getMimeType()).isEqualTo(MimeTypeUtils.IMAGE_JPEG); @@ -435,7 +435,7 @@ void defaultUserText() { assertThat(content).isEqualTo("response"); Message userMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(userMessage.getContent()).isEqualTo("Default user text"); + assertThat(userMessage.getText()).isEqualTo("Default user text"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); // Override the default system text with prompt system @@ -443,7 +443,7 @@ void defaultUserText() { assertThat(content).isEqualTo("response"); userMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(userMessage.getContent()).isEqualTo("Override default user text"); + assertThat(userMessage.getText()).isEqualTo("Override default user text"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); } @@ -456,7 +456,7 @@ void simpleUserPromptAsString() { .isEqualTo("response"); Message userMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(userMessage.getContent()).isEqualTo("User prompt"); + assertThat(userMessage.getText()).isEqualTo("User prompt"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); } @@ -469,7 +469,7 @@ void simpleUserPrompt() { .isEqualTo("response"); Message userMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(userMessage.getContent()).isEqualTo("User prompt"); + assertThat(userMessage.getText()).isEqualTo("User prompt"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); } @@ -488,7 +488,7 @@ void simpleUserPromptObject() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(1); Message userMessage = this.promptCaptor.getValue().getInstructions().get(0); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); - assertThat(userMessage.getContent()).isEqualTo("User prompt"); + assertThat(userMessage.getText()).isEqualTo("User prompt"); assertThat(((UserMessage) userMessage).getMedia()).hasSize(1); } @@ -509,7 +509,7 @@ void simpleSystemPrompt() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(2); Message systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("System prompt"); + assertThat(systemMessage.getText()).isEqualTo("System prompt"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); } @@ -539,11 +539,11 @@ void complexCall() throws MalformedURLException { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(2); Message systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("System text"); + assertThat(systemMessage.getText()).isEqualTo("System text"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); UserMessage userMessage = (UserMessage) this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualTo("User text Rock"); + assertThat(userMessage.getText()).isEqualTo("User text Rock"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); assertThat(userMessage.getMedia()).hasSize(1); assertThat(userMessage.getMedia().iterator().next().getMimeType()).isEqualTo(MimeTypeUtils.IMAGE_PNG); @@ -598,7 +598,7 @@ void whenPromptWithStringContent() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(1); var userMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(userMessage.getContent()).isEqualTo("my question"); + assertThat(userMessage.getText()).isEqualTo("my question"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); } @@ -615,7 +615,7 @@ void whenPromptWithMessages() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(2); var userMessage = this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualTo("my question"); + assertThat(userMessage.getText()).isEqualTo("my question"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); } @@ -631,7 +631,7 @@ void whenPromptWithStringContentAndUserText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(2); var userMessage = this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualTo("another question"); + assertThat(userMessage.getText()).isEqualTo("another question"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); } @@ -648,7 +648,7 @@ void whenPromptWithHistoryAndUserText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(3); var userMessage = this.promptCaptor.getValue().getInstructions().get(2); - assertThat(userMessage.getContent()).isEqualTo("another question"); + assertThat(userMessage.getText()).isEqualTo("another question"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); } @@ -665,7 +665,7 @@ void whenPromptWithUserMessageAndUserText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(2); var userMessage = this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualTo("another question"); + assertThat(userMessage.getText()).isEqualTo("another question"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); } @@ -682,7 +682,7 @@ void whenMessagesWithHistoryAndUserText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(3); var userMessage = this.promptCaptor.getValue().getInstructions().get(2); - assertThat(userMessage.getContent()).isEqualTo("another question"); + assertThat(userMessage.getText()).isEqualTo("another question"); } @Test @@ -698,7 +698,7 @@ void whenMessagesWithUserMessageAndUserText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(2); var userMessage = this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualTo("another question"); + assertThat(userMessage.getText()).isEqualTo("another question"); assertThat(userMessage.getMessageType()).isEqualTo(MessageType.USER); } @@ -717,7 +717,7 @@ void whenPromptWithMessagesAndSystemText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(4); var systemMessage = this.promptCaptor.getValue().getInstructions().get(2); - assertThat(systemMessage.getContent()).isEqualTo("instructions"); + assertThat(systemMessage.getText()).isEqualTo("instructions"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); } @@ -734,7 +734,7 @@ void whenPromptWithSystemMessageAndNoSystemText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(3); var systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("instructions"); + assertThat(systemMessage.getText()).isEqualTo("instructions"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); } @@ -751,7 +751,7 @@ void whenPromptWithSystemMessageAndSystemText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(4); var systemMessage = this.promptCaptor.getValue().getInstructions().get(2); - assertThat(systemMessage.getContent()).isEqualTo("other instructions"); + assertThat(systemMessage.getText()).isEqualTo("other instructions"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); } @@ -773,7 +773,7 @@ void whenMessagesAndSystemText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(4); var systemMessage = this.promptCaptor.getValue().getInstructions().get(2); - assertThat(systemMessage.getContent()).isEqualTo("instructions"); + assertThat(systemMessage.getText()).isEqualTo("instructions"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); } @@ -790,7 +790,7 @@ void whenMessagesWithSystemMessageAndNoSystemText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(3); var systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - assertThat(systemMessage.getContent()).isEqualTo("instructions"); + assertThat(systemMessage.getText()).isEqualTo("instructions"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); } @@ -812,7 +812,7 @@ void whenMessagesWithSystemMessageAndSystemText() { assertThat(this.promptCaptor.getValue().getInstructions()).hasSize(4); var systemMessage = this.promptCaptor.getValue().getInstructions().get(2); - assertThat(systemMessage.getContent()).isEqualTo("other instructions"); + assertThat(systemMessage.getText()).isEqualTo("other instructions"); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); } diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java index 7cc9ff91bd0..92cdeee2aa5 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java @@ -97,7 +97,7 @@ void whenPromptContentThenReturn() { DefaultChatClient.DefaultChatClientRequestSpec spec = (DefaultChatClient.DefaultChatClientRequestSpec) chatClient .prompt("my question"); assertThat(spec.getMessages()).hasSize(1); - assertThat(spec.getMessages().get(0).getContent()).isEqualTo("my question"); + assertThat(spec.getMessages().get(0).getText()).isEqualTo("my question"); } @Test @@ -107,8 +107,8 @@ void whenPromptWithMessagesThenReturn() { DefaultChatClient.DefaultChatClientRequestSpec spec = (DefaultChatClient.DefaultChatClientRequestSpec) chatClient .prompt(prompt); assertThat(spec.getMessages()).hasSize(2); - assertThat(spec.getMessages().get(0).getContent()).isEqualTo("instructions"); - assertThat(spec.getMessages().get(1).getContent()).isEqualTo("my question"); + assertThat(spec.getMessages().get(0).getText()).isEqualTo("instructions"); + assertThat(spec.getMessages().get(1).getText()).isEqualTo("my question"); assertThat(spec.getChatOptions()).isNull(); } @@ -627,11 +627,11 @@ void whenSimplePromptThenChatResponse() { ChatResponse chatResponse = spec.chatResponse(); assertThat(chatResponse).isNotNull(); - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo("response"); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo("response"); Prompt actualPrompt = promptCaptor.getValue(); assertThat(actualPrompt.getInstructions()).hasSize(1); - assertThat(actualPrompt.getInstructions().get(0).getContent()).isEqualTo("my question"); + assertThat(actualPrompt.getInstructions().get(0).getText()).isEqualTo("my question"); } @Test @@ -650,12 +650,12 @@ void whenFullPromptThenChatResponse() { ChatResponse chatResponse = spec.chatResponse(); assertThat(chatResponse).isNotNull(); - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo("response"); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo("response"); Prompt actualPrompt = promptCaptor.getValue(); assertThat(actualPrompt.getInstructions()).hasSize(2); - assertThat(actualPrompt.getInstructions().get(0).getContent()).isEqualTo("instructions"); - assertThat(actualPrompt.getInstructions().get(1).getContent()).isEqualTo("my question"); + assertThat(actualPrompt.getInstructions().get(0).getText()).isEqualTo("instructions"); + assertThat(actualPrompt.getInstructions().get(1).getText()).isEqualTo("my question"); } @Test @@ -675,13 +675,13 @@ void whenPromptAndUserTextThenChatResponse() { ChatResponse chatResponse = spec.chatResponse(); assertThat(chatResponse).isNotNull(); - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo("response"); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo("response"); Prompt actualPrompt = promptCaptor.getValue(); assertThat(actualPrompt.getInstructions()).hasSize(3); - assertThat(actualPrompt.getInstructions().get(0).getContent()).isEqualTo("instructions"); - assertThat(actualPrompt.getInstructions().get(1).getContent()).isEqualTo("my question"); - assertThat(actualPrompt.getInstructions().get(2).getContent()).isEqualTo("another question"); + assertThat(actualPrompt.getInstructions().get(0).getText()).isEqualTo("instructions"); + assertThat(actualPrompt.getInstructions().get(1).getText()).isEqualTo("my question"); + assertThat(actualPrompt.getInstructions().get(2).getText()).isEqualTo("another question"); } @Test @@ -702,13 +702,13 @@ void whenUserTextAndMessagesThenChatResponse() { ChatResponse chatResponse = spec.chatResponse(); assertThat(chatResponse).isNotNull(); - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo("response"); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo("response"); Prompt actualPrompt = promptCaptor.getValue(); assertThat(actualPrompt.getInstructions()).hasSize(3); - assertThat(actualPrompt.getInstructions().get(0).getContent()).isEqualTo("instructions"); - assertThat(actualPrompt.getInstructions().get(1).getContent()).isEqualTo("my question"); - assertThat(actualPrompt.getInstructions().get(2).getContent()).isEqualTo("another question"); + assertThat(actualPrompt.getInstructions().get(0).getText()).isEqualTo("instructions"); + assertThat(actualPrompt.getInstructions().get(1).getText()).isEqualTo("my question"); + assertThat(actualPrompt.getInstructions().get(2).getText()).isEqualTo("another question"); } @Test @@ -1090,11 +1090,11 @@ void whenSimplePromptThenFluxChatResponse() { ChatResponse chatResponse = spec.chatResponse().blockLast(); assertThat(chatResponse).isNotNull(); - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo("response"); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo("response"); Prompt actualPrompt = promptCaptor.getValue(); assertThat(actualPrompt.getInstructions()).hasSize(1); - assertThat(actualPrompt.getInstructions().get(0).getContent()).isEqualTo("my question"); + assertThat(actualPrompt.getInstructions().get(0).getText()).isEqualTo("my question"); } @Test @@ -1113,12 +1113,12 @@ void whenFullPromptThenFluxChatResponse() { ChatResponse chatResponse = spec.chatResponse().blockLast(); assertThat(chatResponse).isNotNull(); - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo("response"); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo("response"); Prompt actualPrompt = promptCaptor.getValue(); assertThat(actualPrompt.getInstructions()).hasSize(2); - assertThat(actualPrompt.getInstructions().get(0).getContent()).isEqualTo("instructions"); - assertThat(actualPrompt.getInstructions().get(1).getContent()).isEqualTo("my question"); + assertThat(actualPrompt.getInstructions().get(0).getText()).isEqualTo("instructions"); + assertThat(actualPrompt.getInstructions().get(1).getText()).isEqualTo("my question"); } @Test @@ -1138,13 +1138,13 @@ void whenPromptAndUserTextThenFluxChatResponse() { ChatResponse chatResponse = spec.chatResponse().blockLast(); assertThat(chatResponse).isNotNull(); - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo("response"); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo("response"); Prompt actualPrompt = promptCaptor.getValue(); assertThat(actualPrompt.getInstructions()).hasSize(3); - assertThat(actualPrompt.getInstructions().get(0).getContent()).isEqualTo("instructions"); - assertThat(actualPrompt.getInstructions().get(1).getContent()).isEqualTo("my question"); - assertThat(actualPrompt.getInstructions().get(2).getContent()).isEqualTo("another question"); + assertThat(actualPrompt.getInstructions().get(0).getText()).isEqualTo("instructions"); + assertThat(actualPrompt.getInstructions().get(1).getText()).isEqualTo("my question"); + assertThat(actualPrompt.getInstructions().get(2).getText()).isEqualTo("another question"); } @Test @@ -1165,13 +1165,13 @@ void whenUserTextAndMessagesThenFluxChatResponse() { ChatResponse chatResponse = spec.chatResponse().blockLast(); assertThat(chatResponse).isNotNull(); - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo("response"); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo("response"); Prompt actualPrompt = promptCaptor.getValue(); assertThat(actualPrompt.getInstructions()).hasSize(3); - assertThat(actualPrompt.getInstructions().get(0).getContent()).isEqualTo("instructions"); - assertThat(actualPrompt.getInstructions().get(1).getContent()).isEqualTo("my question"); - assertThat(actualPrompt.getInstructions().get(2).getContent()).isEqualTo("another question"); + assertThat(actualPrompt.getInstructions().get(0).getText()).isEqualTo("instructions"); + assertThat(actualPrompt.getInstructions().get(1).getText()).isEqualTo("my question"); + assertThat(actualPrompt.getInstructions().get(2).getText()).isEqualTo("another question"); } @Test diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/QuestionAnswerAdvisorTests.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/QuestionAnswerAdvisorTests.java index 08b365ffd96..7a02fb00408 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/QuestionAnswerAdvisorTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/QuestionAnswerAdvisorTests.java @@ -148,22 +148,22 @@ public Duration getTokensReset() { assertThat(response.getMetadata().get("key6").toString()).isEqualTo("value6"); assertThat(response.getMetadata().get("key1").toString()).isEqualTo("value1"); - String content = response.getResult().getOutput().getContent(); + String content = response.getResult().getOutput().getText(); assertThat(content).isEqualTo("Your answer is ZXY"); Message systemMessage = this.promptCaptor.getValue().getInstructions().get(0); - System.out.println(systemMessage.getContent()); + System.out.println(systemMessage.getText()); - assertThat(systemMessage.getContent()).isEqualToIgnoringWhitespace(""" + assertThat(systemMessage.getText()).isEqualToIgnoringWhitespace(""" Default system text. """); assertThat(systemMessage.getMessageType()).isEqualTo(MessageType.SYSTEM); Message userMessage = this.promptCaptor.getValue().getInstructions().get(1); - assertThat(userMessage.getContent()).isEqualToIgnoringWhitespace(""" + assertThat(userMessage.getText()).isEqualToIgnoringWhitespace(""" Please answer my question XYZ Context information is below, surrounded by --------------------- @@ -204,7 +204,7 @@ public void qaAdvisorTakesUserTextParametersIntoAccountForSimilaritySearch() { //formatter:on var expectedQuery = "Please answer my question XYZ"; - var userPrompt = this.promptCaptor.getValue().getInstructions().get(0).getContent(); + var userPrompt = this.promptCaptor.getValue().getInstructions().get(0).getText(); assertThat(userPrompt).doesNotContain(userTextTemplate); assertThat(userPrompt).contains(expectedQuery); assertThat(this.vectorSearchCaptor.getValue().getQuery()).isEqualTo(expectedQuery); @@ -233,7 +233,7 @@ public void qaAdvisorTakesUserParameterizedUserMessagesIntoAccountForSimilarityS //formatter:on var expectedQuery = "Please answer my question XYZ"; - var userPrompt = this.promptCaptor.getValue().getInstructions().get(0).getContent(); + var userPrompt = this.promptCaptor.getValue().getInstructions().get(0).getText(); assertThat(userPrompt).doesNotContain(userTextTemplate); assertThat(userPrompt).contains(expectedQuery); assertThat(this.vectorSearchCaptor.getValue().getQuery()).isEqualTo(expectedQuery); diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/RetrievalAugmentationAdvisorTests.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/RetrievalAugmentationAdvisorTests.java index c8e336d6ce2..a78bb169336 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/RetrievalAugmentationAdvisorTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/RetrievalAugmentationAdvisorTests.java @@ -70,8 +70,8 @@ void theOneWithTheDocumentRetriever() { .build()); // Document Retriever - var documentContext = List.of(Document.builder().id("1").content("doc1").build(), - Document.builder().id("2").content("doc2").build()); + var documentContext = List.of(Document.builder().id("1").text("doc1").build(), + Document.builder().id("2").text("doc2").build()); var documentRetriever = mock(DocumentRetriever.class); var queryCaptor = ArgumentCaptor.forClass(Query.class); given(documentRetriever.retrieve(queryCaptor.capture())).willReturn(documentContext); @@ -94,7 +94,7 @@ void theOneWithTheDocumentRetriever() { .chatResponse(); // Verify - assertThat(chatResponse.getResult().getOutput().getContent()).isEqualTo("Felix Felicis"); + assertThat(chatResponse.getResult().getOutput().getText()).isEqualTo("Felix Felicis"); assertThat(chatResponse.getMetadata().>get(RetrievalAugmentationAdvisor.DOCUMENT_CONTEXT)) .containsAll(documentContext); diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisorTests.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisorTests.java index b12e1b24f3a..3a62b7a1fdd 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisorTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisorTests.java @@ -101,7 +101,7 @@ private void validate(String content, CapturedOutput output) { assertThat(content).isEqualTo("Your answer is ZXY"); UserMessage userMessage = (UserMessage) this.promptCaptor.getValue().getInstructions().get(0); - assertThat(userMessage.getContent()).isEqualToIgnoringWhitespace("Please answer my question XYZ"); + assertThat(userMessage.getText()).isEqualToIgnoringWhitespace("Please answer my question XYZ"); assertThat(output.getOut()).contains("request: AdvisedRequest", "userText=Please answer my question XYZ"); assertThat(output.getOut()).contains("response:", "finishReason"); diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/model/GenerationTests.java b/spring-ai-core/src/test/java/org/springframework/ai/chat/model/GenerationTests.java index b5e173e1d4b..eec8649147e 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/model/GenerationTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/chat/model/GenerationTests.java @@ -52,7 +52,7 @@ void testGetOutput() { AssistantMessage assistantMessage = new AssistantMessage(expectedText); Generation generation = new Generation(assistantMessage); - assertEquals(expectedText, generation.getOutput().getContent()); + assertEquals(expectedText, generation.getOutput().getText()); } @Test diff --git a/spring-ai-core/src/test/java/org/springframework/ai/document/ContentFormatterTests.java b/spring-ai-core/src/test/java/org/springframework/ai/document/ContentFormatterTests.java index 98b5dc6319c..2e3574d5370 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/document/ContentFormatterTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/document/ContentFormatterTests.java @@ -61,5 +61,4 @@ public void defaultConfigTextFormatter() { .isEqualTo(defaultConfigFormatter.format(this.document, MetadataMode.ALL)); } - } diff --git a/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentBuilderTests.java b/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentBuilderTests.java index e6a9505082f..a78525d1f23 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentBuilderTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentBuilderTests.java @@ -59,7 +59,7 @@ void testWithIdGenerator() { assertThat(result).isSameAs(this.builder); - Document document = result.content("Test content").metadata("key", "value").build(); + Document document = result.text("Test content").metadata("key", "value").build(); assertThat(document.getId()).isEqualTo("mockedId"); } @@ -80,7 +80,8 @@ void testWithId() { @Test void testWithIdNullOrEmpty() { - assertThatThrownBy(() -> this.builder.text("text").id(null).build()).isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> this.builder.text("text").id(null).build()) + .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("id cannot be null or empty"); assertThatThrownBy(() -> this.builder.text("text").id("").build()).isInstanceOf(IllegalArgumentException.class) @@ -89,13 +90,12 @@ void testWithIdNullOrEmpty() { @Test void testWithContent() { - Document.Builder result = this.builder.content("Test content"); + Document.Builder result = this.builder.text("Test content"); assertThat(result).isSameAs(this.builder); assertThat(result.build().getContent()).isEqualTo("Test content"); } - @Test void testWithMediaSingle() throws MalformedURLException { URL mediaUrl = new URL("http://test"); @@ -120,7 +120,8 @@ void testWithMetadataMap() { @Test void testWithMetadataMapNull() { - assertThatThrownBy(() -> this.builder.text("text").metadata(null).build()).isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> this.builder.text("text").metadata(null).build()) + .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("metadata cannot be null"); } @@ -136,19 +137,19 @@ void testWithMetadataKeyValue() { void testWithMetadataKeyNull() { assertThatThrownBy(() -> this.builder.text("text").metadata(null, "value").build()) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("metadata cannot have null keys"); + .hasMessageContaining("metadata key cannot be null"); } @Test void testWithMetadataValueNull() { assertThatThrownBy(() -> this.builder.text("text").metadata("key", null).build()) .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("metadata cannot have null values"); + .hasMessageContaining("metadata value cannot be null"); } @Test void testBuildWithoutId() { - Document document = this.builder.text("text").content("Test content").build(); + Document document = this.builder.text("text").text("Test content").build(); assertThat(document.getId()).isNotNull().isNotEmpty(); assertThat(document.getContent()).isEqualTo("Test content"); @@ -161,10 +162,7 @@ void testBuildWithAllProperties() { Map metadata = new HashMap<>(); metadata.put("key", "value"); - Document document = this.builder.id("customId") - .text("Test content") - .metadata(metadata) - .build(); + Document document = this.builder.id("customId").text("Test content").metadata(metadata).build(); assertThat(document.getId()).isEqualTo("customId"); assertThat(document.getText()).isEqualTo("Test content"); diff --git a/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentTests.java b/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentTests.java index a2d92be647f..b7089afe557 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/document/DocumentTests.java @@ -17,6 +17,8 @@ package org.springframework.ai.document; import org.junit.jupiter.api.Test; + +import org.springframework.ai.document.id.IdGenerator; import org.springframework.ai.model.Media; import org.springframework.util.MimeTypeUtils; @@ -34,14 +36,14 @@ public class DocumentTests { @Test void testScore() { Double score = 0.95; - Document document = Document.builder().content("Test content").score(score).build(); + Document document = Document.builder().text("Test content").score(score).build(); assertThat(document.getScore()).isEqualTo(score); } @Test void testNullScore() { - Document document = Document.builder().content("Test content").score(null).build(); + Document document = Document.builder().text("Test content").score(null).build(); assertThat(document.getScore()).isNull(); } @@ -55,7 +57,7 @@ void testMutate() { Document original = Document.builder() .id("customId") - .content("Test content") + .text("Test content") .media(null) .metadata(metadata) .score(score) @@ -73,23 +75,13 @@ void testEquals() { metadata.put("key", "value"); Double score = 0.95; - Document doc1 = Document.builder() - .id("customId") - .text("Test text") - .metadata(metadata) - .score(score) - .build(); + Document doc1 = Document.builder().id("customId").text("Test text").metadata(metadata).score(score).build(); - Document doc2 = Document.builder() - .id("customId") - .text("Test text") - .metadata(metadata) - .score(score) - .build(); + Document doc2 = Document.builder().id("customId").text("Test text").metadata(metadata).score(score).build(); Document differentDoc = Document.builder() .id("differentId") - .content("Different content") + .text("Different content") .metadata(metadata) .score(score) .build(); @@ -113,7 +105,7 @@ void testToString() { Document document = Document.builder() .id("customId") - .content("Test content") + .text("Test content") .media(null) .metadata(metadata) .score(score) @@ -122,11 +114,116 @@ void testToString() { String toString = document.toString(); assertThat(toString).contains("id='customId'") - .contains("content='Test content'") + .contains("text='Test content'") .contains("metadata=" + metadata) .contains("score=" + score); } + @Test + void testMediaDocumentConstruction() { + Media media = getMedia(); + Map metadata = new HashMap<>(); + metadata.put("key", "value"); + + Document document = Document.builder().media(media).metadata(metadata).build(); + + assertThat(document.getMedia()).isEqualTo(media); + assertThat(document.getText()).isNull(); + assertThat(document.isText()).isFalse(); + } + + @Test + void testTextDocumentConstruction() { + Map metadata = new HashMap<>(); + metadata.put("key", "value"); + + Document document = Document.builder().text("Test text").metadata(metadata).build(); + + assertThat(document.getText()).isEqualTo("Test text"); + assertThat(document.getMedia()).isNull(); + assertThat(document.isText()).isTrue(); + } + + @Test + void testBothTextAndMediaThrowsException() { + Media media = getMedia(); + assertThrows(IllegalArgumentException.class, () -> Document.builder().text("Test text").media(media).build()); + } + + @Test + void testCustomIdGenerator() { + IdGenerator customGenerator = contents -> "custom-" + contents[0]; + + Document document = Document.builder().text("test").idGenerator(customGenerator).build(); + + assertThat(document.getId()).isEqualTo("custom-test"); + } + + @Test + void testMetadataValidation() { + Map metadata = new HashMap<>(); + metadata.put("nullKey", null); + + assertThrows(IllegalArgumentException.class, () -> Document.builder().text("test").metadata(metadata).build()); + } + + @Test + void testFormattedContent() { + Map metadata = new HashMap<>(); + metadata.put("key", "value"); + + Document document = Document.builder().text("Test text").metadata(metadata).build(); + + String formattedContent = document.getFormattedContent(MetadataMode.ALL); + assertThat(formattedContent).contains("Test text"); + assertThat(formattedContent).contains("key"); + assertThat(formattedContent).contains("value"); + } + + @Test + void testCustomFormattedContent() { + Document document = Document.builder().text("Test text").build(); + + ContentFormatter customFormatter = (doc, mode) -> "Custom: " + doc.getText(); + String formattedContent = document.getFormattedContent(customFormatter, MetadataMode.ALL); + + assertThat(formattedContent).isEqualTo("Custom: Test text"); + } + + @Test + void testNullIdThrowsException() { + assertThrows(IllegalArgumentException.class, () -> Document.builder().id(null).text("test").build()); + } + + @Test + void testEmptyIdThrowsException() { + assertThrows(IllegalArgumentException.class, () -> Document.builder().id("").text("test").build()); + } + + @Test + void testMetadataKeyValueAddition() { + Document document = Document.builder() + .text("test") + .metadata("key1", "value1") + .metadata("key2", "value2") + .build(); + + assertThat(document.getMetadata()).containsEntry("key1", "value1").containsEntry("key2", "value2"); + } + + @Test + void testEmbeddingOperations() { + float[] embedding = new float[] { 0.1f, 0.2f, 0.3f }; + + Document document = Document.builder().text("test").embedding(embedding).build(); + + assertThat(document.getEmbedding()).isEqualTo(embedding); + } + + @Test + void testNullEmbeddingThrowsException() { + assertThrows(IllegalArgumentException.class, () -> Document.builder().text("test").embedding(null).build()); + } private static Media getMedia() { try { diff --git a/spring-ai-core/src/test/java/org/springframework/ai/prompt/PromptTemplateTest.java b/spring-ai-core/src/test/java/org/springframework/ai/prompt/PromptTemplateTest.java index 096d5e21cca..57c0a3c76fb 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/prompt/PromptTemplateTest.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/prompt/PromptTemplateTest.java @@ -115,7 +115,7 @@ public void testRenderWithList() { // don't normalize EOLs. // It should be fine on Unix systems. In addition, Git will replace CRLF by LF by // default. - assertEqualsWithNormalizedEOLs(expected, message.getContent()); + assertEqualsWithNormalizedEOLs(expected, message.getText()); PromptTemplate unfilledPromptTemplate = new PromptTemplate(templateString); assertThatExceptionOfType(IllegalStateException.class).isThrownBy(unfilledPromptTemplate::render) diff --git a/spring-ai-core/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreTests.java b/spring-ai-core/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreTests.java index 07564c76b41..4e81eb5d358 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreTests.java +++ b/spring-ai-core/src/test/java/org/springframework/ai/vectorstore/SimpleVectorStoreTests.java @@ -62,7 +62,7 @@ void setUp() { @Test void shouldAddAndRetrieveDocument() { - Document doc = Document.builder().id("1").content("test content").metadata(Map.of("key", "value")).build(); + Document doc = Document.builder().id("1").text("test content").metadata(Map.of("key", "value")).build(); this.vectorStore.add(List.of(doc)); @@ -76,8 +76,8 @@ void shouldAddAndRetrieveDocument() { @Test void shouldAddMultipleDocuments() { - List docs = Arrays.asList(Document.builder().id("1").content("first").build(), - Document.builder().id("2").content("second").build()); + List docs = Arrays.asList(Document.builder().id("1").text("first").build(), + Document.builder().id("2").text("second").build()); this.vectorStore.add(docs); @@ -100,7 +100,7 @@ void shouldHandleNullDocumentList() { @Test void shouldDeleteDocuments() { - Document doc = Document.builder().id("1").content("test content").build(); + Document doc = Document.builder().id("1").text("test content").build(); this.vectorStore.add(List.of(doc)); assertThat(this.vectorStore.similaritySearch("test")).hasSize(1); @@ -121,7 +121,7 @@ void shouldPerformSimilaritySearchWithThreshold() { // Configure mock to return different embeddings for different queries when(this.mockEmbeddingModel.embed("query")).thenReturn(new float[] { 0.9f, 0.9f, 0.9f }); - Document doc = Document.builder().id("1").content("test content").build(); + Document doc = Document.builder().id("1").text("test content").build(); this.vectorStore.add(List.of(doc)); @@ -135,7 +135,7 @@ void shouldPerformSimilaritySearchWithThreshold() { void shouldSaveAndLoadVectorStore() throws IOException { Document doc = Document.builder() .id("1") - .content("test content") + .text("test content") .metadata(new HashMap<>(Map.of("key", "value"))) .build(); @@ -181,7 +181,7 @@ void shouldHandleConcurrentOperations() throws InterruptedException { for (int i = 0; i < numThreads; i++) { final String id = String.valueOf(i); threads[i] = new Thread(() -> { - Document doc = Document.builder().id(id).content("content " + id).build(); + Document doc = Document.builder().id(id).text("content " + id).build(); this.vectorStore.add(List.of(doc)); }); threads[i].start(); diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/RetrievalAugmentationAdvisorIT.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/RetrievalAugmentationAdvisorIT.java index 1ff422c6d09..a971ddba6f7 100644 --- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/RetrievalAugmentationAdvisorIT.java +++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/client/advisor/RetrievalAugmentationAdvisorIT.java @@ -96,7 +96,7 @@ void ragBasic() { assertThat(chatResponse).isNotNull(); - String response = chatResponse.getResult().getOutput().getContent(); + String response = chatResponse.getResult().getOutput().getText(); System.out.println(response); assertThat(response).containsIgnoringCase("Highlands"); @@ -126,7 +126,7 @@ void ragWithTranslation() { assertThat(chatResponse).isNotNull(); - String response = chatResponse.getResult().getOutput().getContent(); + String response = chatResponse.getResult().getOutput().getText(); System.out.println(response); assertThat(response.toLowerCase()).containsAnyOf("highlands", "højland"); @@ -154,7 +154,7 @@ void ragWithMultiQuery() { assertThat(chatResponse).isNotNull(); - String response = chatResponse.getResult().getOutput().getContent(); + String response = chatResponse.getResult().getOutput().getText(); System.out.println(response); assertThat(response).containsIgnoringCase("Highlands"); @@ -164,7 +164,7 @@ void ragWithMultiQuery() { private void evaluateRelevancy(String question, ChatResponse chatResponse) { EvaluationRequest evaluationRequest = new EvaluationRequest(question, chatResponse.getMetadata().get(RetrievalAugmentationAdvisor.DOCUMENT_CONTEXT), - chatResponse.getResult().getOutput().getContent()); + chatResponse.getResult().getOutput().getText()); RelevancyEvaluator evaluator = new RelevancyEvaluator(ChatClient.builder(this.openAiChatModel)); EvaluationResponse evaluationResponse = evaluator.evaluate(evaluationRequest); assertThat(evaluationResponse.isPass()).isTrue(); diff --git a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/vectorstore/SimpleVectorStoreIT.java b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/vectorstore/SimpleVectorStoreIT.java index c6bb774db2f..4cc598393e1 100644 --- a/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/vectorstore/SimpleVectorStoreIT.java +++ b/spring-ai-integration-tests/src/test/java/org/springframework/ai/integration/tests/vectorstore/SimpleVectorStoreIT.java @@ -51,17 +51,17 @@ public class SimpleVectorStoreIT { List documents = List.of( Document.builder() .id("471a8c78-549a-4b2c-bce5-ef3ae6579be3") - .content(getText("classpath:/test/data/spring.ai.txt")) + .text(getText("classpath:/test/data/spring.ai.txt")) .metadata(Map.of("meta1", "meta1")) .build(), Document.builder() .id("bc51d7f7-627b-4ba6-adf4-f0bcd1998f8f") - .content(getText("classpath:/test/data/time.shelter.txt")) + .text(getText("classpath:/test/data/time.shelter.txt")) .metadata(Map.of()) .build(), Document.builder() .id("d0237682-1150-44ff-b4d2-1be9b1731ee5") - .content(getText("classpath:/test/data/great.depression.txt")) + .text(getText("classpath:/test/data/great.depression.txt")) .metadata(Map.of("meta2", "meta2")) .build()); @@ -84,7 +84,7 @@ void setUp() { public void searchWithThreshold() { Document document = Document.builder() .id(UUID.randomUUID().toString()) - .content("Spring AI rocks!!") + .text("Spring AI rocks!!") .metadata("meta1", "meta1") .build(); @@ -101,7 +101,7 @@ public void searchWithThreshold() { Document sameIdDocument = Document.builder() .id(document.getId()) - .content("The World is Big and Salvation Lurks Around the Corner") + .text("The World is Big and Salvation Lurks Around the Corner") .metadata("meta2", "meta2") .build(); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java index d550d32b392..6174c5c6711 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/AnthropicAutoConfigurationIT.java @@ -66,7 +66,7 @@ void callWith8KResponseContext() { AnthropicChatModel chatModel = context.getBean(AnthropicChatModel.class); var optoins = AnthropicChatOptions.builder().withMaxTokens(8192).build(); var response = chatModel.call(new Prompt("Tell me a joke", optoins)); - assertThat(response.getResult().getOutput().getContent()).isNotEmpty(); + assertThat(response.getResult().getOutput().getText()).isNotEmpty(); logger.info("Response: " + response); }); } @@ -83,7 +83,7 @@ void stream() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java index 13d503f9456..5a03f27ee76 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithFunctionBeanIT.java @@ -70,14 +70,14 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), AnthropicChatOptions.builder().withFunction("weatherFunction3").build())); logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -100,7 +100,7 @@ void functionCallWithPortableFunctionCallingOptions() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java index f856113e6cc..3c8867ac8be 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/anthropic/tool/FunctionCallWithPromptFunctionIT.java @@ -69,7 +69,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/AzureOpenAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/AzureOpenAiAutoConfigurationIT.java index eecd8c0251f..8af26e0b753 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/AzureOpenAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/AzureOpenAiAutoConfigurationIT.java @@ -98,7 +98,7 @@ void chatCompletion() { this.contextRunner.run(context -> { AzureOpenAiChatModel chatModel = context.getBean(AzureOpenAiChatModel.class); ChatResponse response = chatModel.call(new Prompt(List.of(this.userMessage, this.systemMessage))); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); }); } @@ -144,7 +144,7 @@ void chatCompletionStreaming() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/AzureOpenAiDirectOpenAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/AzureOpenAiDirectOpenAiAutoConfigurationIT.java index 19c651b3efe..88de524d13a 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/AzureOpenAiDirectOpenAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/AzureOpenAiDirectOpenAiAutoConfigurationIT.java @@ -77,7 +77,7 @@ public void chatCompletion() { this.contextRunner.run(context -> { AzureOpenAiChatModel chatModel = context.getBean(AzureOpenAiChatModel.class); ChatResponse response = chatModel.call(new Prompt(List.of(this.userMessage, this.systemMessage))); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); }); } @@ -96,7 +96,7 @@ public void chatCompletionStreaming() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java index 7991bb3e004..2917adaf2ce 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionBeanIT.java @@ -71,14 +71,14 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), AzureOpenAiChatOptions.builder().withFunction("weatherFunction3").build())); logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -100,7 +100,7 @@ void functionCallWithPortableFunctionCallingOptions() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java index f1400ab221f..ae1bb034873 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithFunctionWrapperIT.java @@ -68,7 +68,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java index c682aaa8e58..dae9e5b4e60 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/azure/tool/FunctionCallWithPromptFunctionIT.java @@ -72,7 +72,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/anthropic/BedrockAnthropicChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/anthropic/BedrockAnthropicChatAutoConfigurationIT.java index fca0b2756e6..c20e3cf2ef9 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/anthropic/BedrockAnthropicChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/anthropic/BedrockAnthropicChatAutoConfigurationIT.java @@ -71,7 +71,7 @@ public void chatCompletion() { this.contextRunner.run(context -> { BedrockAnthropicChatModel anthropicChatModel = context.getBean(BedrockAnthropicChatModel.class); ChatResponse response = anthropicChatModel.call(new Prompt(List.of(this.userMessage, this.systemMessage))); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); }); } @@ -91,7 +91,7 @@ public void chatCompletionStreaming() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/anthropic3/BedrockAnthropic3ChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/anthropic3/BedrockAnthropic3ChatAutoConfigurationIT.java index 07b803ad217..afdf1518a07 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/anthropic3/BedrockAnthropic3ChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/anthropic3/BedrockAnthropic3ChatAutoConfigurationIT.java @@ -70,7 +70,7 @@ public void chatCompletion() { this.contextRunner.run(context -> { BedrockAnthropic3ChatModel anthropicChatModel = context.getBean(BedrockAnthropic3ChatModel.class); ChatResponse response = anthropicChatModel.call(new Prompt(List.of(this.userMessage, this.systemMessage))); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); }); } @@ -90,7 +90,7 @@ public void chatCompletionStreaming() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/cohere/BedrockCohereChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/cohere/BedrockCohereChatAutoConfigurationIT.java index ea2dc8cb2f7..890286312c6 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/cohere/BedrockCohereChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/cohere/BedrockCohereChatAutoConfigurationIT.java @@ -74,7 +74,7 @@ public void chatCompletion() { this.contextRunner.run(context -> { BedrockCohereChatModel cohereChatModel = context.getBean(BedrockCohereChatModel.class); ChatResponse response = cohereChatModel.call(new Prompt(List.of(this.userMessage, this.systemMessage))); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); }); } @@ -94,7 +94,7 @@ public void chatCompletionStreaming() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java index e43845a5b8c..936f4b59f6e 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/BedrockConverseProxyChatAutoConfigurationIT.java @@ -70,7 +70,7 @@ void stream() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java index b869d5a464d..4adff902279 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithFunctionBeanIT.java @@ -69,14 +69,14 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), FunctionCallingOptions.builder().withFunction("weatherFunction3").build())); logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -100,7 +100,7 @@ void functionStreamTest() { .block() .stream() .filter(cr -> cr.getResult() != null) - .map(cr -> cr.getResult().getOutput().getContent()) + .map(cr -> cr.getResult().getOutput().getText()) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java index aa05b8dccb8..ed8c7b58ef2 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/converse/tool/FunctionCallWithPromptFunctionIT.java @@ -68,7 +68,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/jurassic2/BedrockAi21Jurassic2ChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/jurassic2/BedrockAi21Jurassic2ChatAutoConfigurationIT.java index ed220057366..2e1eeb59b7c 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/jurassic2/BedrockAi21Jurassic2ChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/jurassic2/BedrockAi21Jurassic2ChatAutoConfigurationIT.java @@ -71,7 +71,7 @@ public void chatCompletion() { BedrockAi21Jurassic2ChatModel ai21Jurassic2ChatModel = context.getBean(BedrockAi21Jurassic2ChatModel.class); ChatResponse response = ai21Jurassic2ChatModel .call(new Prompt(List.of(this.userMessage, this.systemMessage))); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/llama/BedrockLlamaChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/llama/BedrockLlamaChatAutoConfigurationIT.java index cdbeea7016e..786d9ec5656 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/llama/BedrockLlamaChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/llama/BedrockLlamaChatAutoConfigurationIT.java @@ -73,7 +73,7 @@ public void chatCompletion() { this.contextRunner.run(context -> { BedrockLlamaChatModel llamaChatModel = context.getBean(BedrockLlamaChatModel.class); ChatResponse response = llamaChatModel.call(new Prompt(List.of(this.userMessage, this.systemMessage))); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); }); } @@ -93,7 +93,7 @@ public void chatCompletionStreaming() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/titan/BedrockTitanChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/titan/BedrockTitanChatAutoConfigurationIT.java index 557dfd45430..a3dd9b42bec 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/titan/BedrockTitanChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/bedrock/titan/BedrockTitanChatAutoConfigurationIT.java @@ -72,7 +72,7 @@ public void chatCompletion() { this.contextRunner.run(context -> { BedrockTitanChatModel chatModel = context.getBean(BedrockTitanChatModel.class); ChatResponse response = chatModel.call(new Prompt(List.of(this.userMessage, this.systemMessage))); - assertThat(response.getResult().getOutput().getContent()).contains("Blackbeard"); + assertThat(response.getResult().getOutput().getText()).contains("Blackbeard"); }); } @@ -91,7 +91,7 @@ public void chatCompletionStreaming() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Blackbeard"); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryAutoConfigurationIT.java index c1eba20a815..8dbc9dc4ac2 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/chat/memory/cassandra/CassandraChatMemoryAutoConfigurationIT.java @@ -71,7 +71,7 @@ void addAndGet() { assertThat(memory.get(sessionId, Integer.MAX_VALUE)).hasSize(1); assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getMessageType()) .isEqualTo(MessageType.USER); - assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getContent()).isEqualTo("test question"); + assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getText()).isEqualTo("test question"); memory.clear(sessionId); assertThat(memory.get(sessionId, Integer.MAX_VALUE)).isEmpty(); @@ -81,10 +81,10 @@ void addAndGet() { assertThat(memory.get(sessionId, Integer.MAX_VALUE)).hasSize(2); assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(1).getMessageType()) .isEqualTo(MessageType.USER); - assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(1).getContent()).isEqualTo("test question"); + assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(1).getText()).isEqualTo("test question"); assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getMessageType()) .isEqualTo(MessageType.ASSISTANT); - assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getContent()).isEqualTo("test answer"); + assertThat(memory.get(sessionId, Integer.MAX_VALUE).get(0).getText()).isEqualTo("test answer"); CassandraChatMemoryProperties properties = context.getBean(CassandraChatMemoryProperties.class); assertThat(properties.getTimeToLive()).isEqualTo(getTimeToLive()); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java index a0b5c014d8d..e3980a13ab0 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/huggingface/HuggingfaceChatAutoConfigurationIT.java @@ -73,7 +73,7 @@ void generateStreaming() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java index ad91d509411..7dcd4be2b80 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackInPromptIT.java @@ -74,7 +74,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -104,7 +104,7 @@ void streamingFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java index 3cd864d164d..0c597d09bc7 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/FunctionCallbackWithPlainFunctionBeanIT.java @@ -75,7 +75,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); // Test weatherFunctionTwo response = chatModel.call(new Prompt(List.of(userMessage), @@ -83,7 +83,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -128,7 +128,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -146,7 +146,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java index ec0ed5c8100..6a3893274a6 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxAutoConfigurationIT.java @@ -69,7 +69,7 @@ void generateStreaming() { String response = responseFlux.collectList() .block() .stream() - .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getContent()) + .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getText()) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java index 3966cbf2c0d..9336a384889 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/minimax/MiniMaxFunctionCallbackIT.java @@ -70,7 +70,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -93,7 +93,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java index 68c80242ab1..99d91c6f3b0 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/MistralAiAutoConfigurationIT.java @@ -67,7 +67,7 @@ void generateStreaming() { String response = responseFlux.collectList() .block() .stream() - .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getContent()) + .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getText()) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java index 965b9f56215..16a4b6359be 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanIT.java @@ -74,8 +74,8 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsIgnoringCase("T1001"); - assertThat(response.getResult().getOutput().getContent()).containsIgnoringCase("paid"); + assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("T1001"); + assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("paid"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java index 08e84427980..dadbbf1d538 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusBeanOpenAiIT.java @@ -81,8 +81,8 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsIgnoringCase("T1001"); - assertThat(response.getResult().getOutput().getContent()).containsIgnoringCase("paid"); + assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("T1001"); + assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("paid"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java index b9d199e5586..31637c26005 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/PaymentStatusPromptIT.java @@ -76,8 +76,8 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsIgnoringCase("T1001"); - assertThat(response.getResult().getOutput().getContent()).containsIgnoringCase("paid"); + assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("T1001"); + assertThat(response.getResult().getOutput().getText()).containsIgnoringCase("paid"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java index 48edeb116cc..588c089b890 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/mistralai/tool/WeatherServicePromptIT.java @@ -84,7 +84,7 @@ void promptFunctionCall() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("15", "15.0"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("15", "15.0"); }); } @@ -111,7 +111,7 @@ void functionCallWithPortableFunctionCallingOptions() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).containsAnyOf("15", "15.0"); + assertThat(response.getResult().getOutput().getText()).containsAnyOf("15", "15.0"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java index f24c6599cb5..cf8cdd647a3 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/MoonshotAutoConfigurationIT.java @@ -66,7 +66,7 @@ void generateStreaming() { Flux responseFlux = client.stream(new Prompt(new UserMessage("Hello"))); String response = Objects.requireNonNull(responseFlux.collectList().block()) .stream() - .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getContent()) + .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getText()) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java index 550939b63b2..37f4fe121d5 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackInPromptIT.java @@ -75,7 +75,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -105,7 +105,7 @@ void streamingFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java index ba1d4d41604..0456b9e65b9 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -75,7 +75,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); // Test weatherFunctionTwo response = chatModel.call(new Prompt(List.of(userMessage), @@ -83,7 +83,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -127,7 +127,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -145,7 +145,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java index f68bed8b099..de62945c79d 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/moonshot/tool/MoonshotFunctionCallbackIT.java @@ -72,7 +72,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -95,7 +95,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .filter(Objects::nonNull) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/OllamaChatAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/OllamaChatAutoConfigurationIT.java index 3353780992f..40d936968c4 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/OllamaChatAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/OllamaChatAutoConfigurationIT.java @@ -69,7 +69,7 @@ public void chatCompletion() { this.contextRunner.run(context -> { OllamaChatModel chatModel = context.getBean(OllamaChatModel.class); ChatResponse response = chatModel.call(new Prompt(this.userMessage)); - assertThat(response.getResult().getOutput().getContent()).contains("Copenhagen"); + assertThat(response.getResult().getOutput().getText()).contains("Copenhagen"); }); } @@ -88,7 +88,7 @@ public void chatCompletionStreaming() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); assertThat(stitchedResponseContent).contains("Copenhagen"); @@ -107,7 +107,7 @@ public void chatCompletionWithPull() { OllamaChatModel chatModel = context.getBean(OllamaChatModel.class); ChatResponse response = chatModel.call(new Prompt(this.userMessage)); - assertThat(response.getResult().getOutput().getContent()).contains("Copenhagen"); + assertThat(response.getResult().getOutput().getText()).contains("Copenhagen"); modelManager.deleteModel(model); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java index df37a4edbe3..24ca97903c3 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackInPromptIT.java @@ -83,7 +83,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -114,7 +114,7 @@ void streamingFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java index 1ee3667db99..e08094d2e68 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/tool/OllamaFunctionCallbackIT.java @@ -80,7 +80,7 @@ void functionCallTest() { logger.info("Response: " + response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -103,7 +103,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: " + content); @@ -127,9 +127,9 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: " + response.getResult().getOutput().getContent()); + logger.info("Response: " + response.getResult().getOutput().getText()); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java index c72052920f6..6ab471eecc3 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java @@ -129,7 +129,7 @@ void generateStreaming() { String response = responseFlux.collectList() .block() .stream() - .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getContent()) + .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getText()) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); @@ -147,7 +147,7 @@ void streamingWithTokenUsage() { Usage[] streamingTokenUsage = new Usage[1]; String response = responseFlux.collectList().block().stream().map(chatResponse -> { streamingTokenUsage[0] = chatResponse.getMetadata().getUsage(); - return (chatResponse.getResult() != null) ? chatResponse.getResult().getOutput().getContent() : ""; + return (chatResponse.getResult() != null) ? chatResponse.getResult().getOutput().getText() : ""; }).collect(Collectors.joining()); assertThat(streamingTokenUsage[0].getPromptTokens()).isGreaterThan(0); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java index 9526c00f98b..f3e0d085d34 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackInPromptIT.java @@ -73,7 +73,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -106,7 +106,7 @@ void streamingFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java index a4628f4d217..fb02d9bf6ec 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -162,7 +162,7 @@ void trainScheduler() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: {}", response.getResult().getOutput().getContent()); + logger.info("Response: {}", response.getResult().getOutput().getText()); }); } @@ -193,7 +193,7 @@ void functionCallWithDirectBiFunction() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -225,7 +225,7 @@ void functionCallWithBiFunctionClass() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -245,7 +245,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); // Test weatherFunctionTwo response = chatModel.call(new Prompt(List.of(userMessage), @@ -253,7 +253,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -273,9 +273,9 @@ void functionCallWithPortableFunctionCallingOptions() { ChatResponse response = chatModel.call(new Prompt(List.of(userMessage), functionOptions)); - logger.info("Response: {}", response.getResult().getOutput().getContent()); + logger.info("Response: {}", response.getResult().getOutput().getText()); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -298,7 +298,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -314,7 +314,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java index 1337eadb1b1..03b3489c508 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/tool/OpenAiFunctionCallbackIT.java @@ -66,7 +66,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -89,7 +89,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java index 9e5b082c3d2..78842991257 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/qianfan/QianFanAutoConfigurationIT.java @@ -75,7 +75,7 @@ void generateStreaming() { Flux responseFlux = client.stream(new Prompt(new UserMessage("Hello"))); String response = Objects.requireNonNull(responseFlux.collectList().block()) .stream() - .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getContent()) + .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getText()) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); logger.info("Response: " + response); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java index d2888269cab..ca2cdeb3a02 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/VertexAiGeminiAutoConfigurationIT.java @@ -62,7 +62,7 @@ void generateStreaming() { String response = responseFlux.collectList() .block() .stream() - .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getContent()) + .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getText()) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java index b65315a749a..530e564eb22 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionBeanIT.java @@ -73,21 +73,21 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().withFunction("weatherFunction3").build())); logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel .call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().build())); logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).doesNotContain("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).doesNotContain("30", "10", "15"); }); } @@ -113,14 +113,14 @@ void functionCallWithPortableFunctionCallingOptions() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); response = chatModel.call(new Prompt(List.of(userMessage), VertexAiGeminiChatOptions.builder().withFunction("weatherFunction3").build())); logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java index 79272be73a6..111cc1db693 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithFunctionWrapperIT.java @@ -69,7 +69,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java index d051490ed9c..388622f09d4 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/vertexai/gemini/tool/FunctionCallWithPromptFunctionIT.java @@ -80,7 +80,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); // Verify that no function call is made. response = chatModel @@ -88,7 +88,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).doesNotContain("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).doesNotContain("30", "10", "15"); }); } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java index 992af88753b..f60814cb4cf 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/ZhiPuAiAutoConfigurationIT.java @@ -72,7 +72,7 @@ void generateStreaming() { String response = responseFlux.collectList() .block() .stream() - .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getContent()) + .map(chatResponse -> chatResponse.getResults().get(0).getOutput().getText()) .collect(Collectors.joining()); assertThat(response).isNotEmpty(); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java index f3d39a0a745..7bea61c1c18 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackInPromptIT.java @@ -77,7 +77,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -107,7 +107,7 @@ void streamingFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java index 8c5fcb525c8..a83c29c65a8 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/FunctionCallbackWithPlainFunctionBeanIT.java @@ -75,7 +75,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); // Test weatherFunctionTwo response = chatModel.call(new Prompt(List.of(userMessage), @@ -83,7 +83,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -127,7 +127,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); @@ -145,7 +145,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java index d22c745ea2d..db3a177f479 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java +++ b/spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/zhipuai/tool/ZhipuAiFunctionCallbackIT.java @@ -71,7 +71,7 @@ void functionCallTest() { logger.info("Response: {}", response); - assertThat(response.getResult().getOutput().getContent()).contains("30", "10", "15"); + assertThat(response.getResult().getOutput().getText()).contains("30", "10", "15"); }); } @@ -94,7 +94,7 @@ void streamFunctionCallTest() { .map(ChatResponse::getResults) .flatMap(List::stream) .map(Generation::getOutput) - .map(AssistantMessage::getContent) + .map(AssistantMessage::getText) .collect(Collectors.joining()); logger.info("Response: {}", content); diff --git a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt index 3e1d45ec9f8..0d171acc2e7 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt +++ b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackContextKotlinIT.kt @@ -74,7 +74,7 @@ class FunctionCallbackResolverKotlinIT : BaseOllamaIT() { logger.info("Response: " + response) - assertThat(response.getResult().output.content).contains("30", "10", "15") + assertThat(response.getResult().output.text).contains("30", "10", "15") } } @@ -94,9 +94,9 @@ class FunctionCallbackResolverKotlinIT : BaseOllamaIT() { val response = chatModel.call(Prompt(listOf(userMessage), functionOptions)); - logger.info("Response: " + response.getResult().getOutput().getContent()); + logger.info("Response: " + response.getResult().getOutput().getText()); - assertThat(response.getResult().output.content).contains("30", "10", "15"); + assertThat(response.getResult().output.text).contains("30", "10", "15"); } } diff --git a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt index c5d7d300aea..3376f24c06e 100644 --- a/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt +++ b/spring-ai-spring-boot-autoconfigure/src/test/kotlin/org/springframework/ai/autoconfigure/ollama/tool/FunctionCallbackKotlinIT.kt @@ -74,7 +74,7 @@ class FunctionCallbackKotlinIT : BaseOllamaIT() { logger.info("Response: " + response) - assertThat(response.getResult().output.content).contains("30", "10", "15") + assertThat(response.getResult().output.text).contains("30", "10", "15") } } @@ -94,9 +94,9 @@ class FunctionCallbackKotlinIT : BaseOllamaIT() { val response = chatModel.call(Prompt(listOf(userMessage), functionOptions)); - logger.info("Response: " + response.getResult().getOutput().getContent()); + logger.info("Response: " + response.getResult().getOutput().getText()); - assertThat(response.getResult().output.content).contains("30", "10", "15"); + assertThat(response.getResult().output.text).contains("30", "10", "15"); } } diff --git a/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java b/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java index ea056cca3f9..69e50493c17 100644 --- a/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java +++ b/spring-ai-test/src/main/java/org/springframework/ai/evaluation/BasicEvaluationTest.java @@ -69,12 +69,12 @@ protected void evaluateQuestionAndAnswer(String question, String answer, boolean } Message userMessage = userPromptTemplate.createMessage(); Prompt prompt = new Prompt(List.of(userMessage, systemMessage)); - String yesOrNo = this.openAiChatModel.call(prompt).getResult().getOutput().getContent(); + String yesOrNo = this.openAiChatModel.call(prompt).getResult().getOutput().getText(); logger.info("Is Answer related to question: " + yesOrNo); if (yesOrNo.equalsIgnoreCase("no")) { SystemMessage notRelatedSystemMessage = new SystemMessage(this.qaEvaluatorNotRelatedResource); prompt = new Prompt(List.of(userMessage, notRelatedSystemMessage)); - String reasonForFailure = this.openAiChatModel.call(prompt).getResult().getOutput().getContent(); + String reasonForFailure = this.openAiChatModel.call(prompt).getResult().getOutput().getText(); fail(reasonForFailure); } else { diff --git a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/CosmosDBVectorStore.java b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/CosmosDBVectorStore.java index eb3fba4b307..bde2eea6231 100644 --- a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/CosmosDBVectorStore.java +++ b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/CosmosDBVectorStore.java @@ -340,7 +340,7 @@ public List doSimilaritySearch(SearchRequest request) { .block(); // Convert JsonNode to Document List docs = documents.stream() - .map(doc -> Document.builder().id(doc.get("id").asText()).content(doc.get("content").asText()).build()) + .map(doc -> Document.builder().id(doc.get("id").asText()).text(doc.get("content").asText()).build()) .collect(Collectors.toList()); return docs != null ? docs : List.of(); diff --git a/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java b/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java index f48f7dca656..6931adea59f 100644 --- a/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java +++ b/vector-stores/spring-ai-azure-store/src/main/java/org/springframework/ai/vectorstore/azure/AzureVectorStore.java @@ -325,7 +325,7 @@ public List doSimilaritySearch(SearchRequest request) { return Document.builder() .id(entry.id()) - .content(entry.content) + .text(entry.content) .metadata(metadata) .score(result.getScore()) .build(); diff --git a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/CassandraChatMemory.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/CassandraChatMemory.java index 854afa52b4e..c6453de5b27 100644 --- a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/CassandraChatMemory.java +++ b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/chat/memory/CassandraChatMemory.java @@ -108,7 +108,7 @@ public void add(String sessionId, Message msg) { Instant instant = (Instant) msg.getMetadata().get(CONVERSATION_TS); builder = builder.setInstant(CassandraChatMemoryConfig.DEFAULT_EXCHANGE_ID_NAME, instant) - .setString("message", msg.getContent()); + .setString("message", msg.getText()); this.conf.session.execute(builder.build()); } diff --git a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStore.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStore.java index 109541f2544..c4799f9a488 100644 --- a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStore.java +++ b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/CassandraVectorStore.java @@ -262,7 +262,7 @@ public List doSimilaritySearch(SearchRequest request) { } Document doc = Document.builder() .id(getDocumentId(row)) - .content(row.getString(this.conf.schema.content())) + .text(row.getString(this.conf.schema.content())) .metadata(docFields) .score((double) score) .build(); diff --git a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java index 003cc9386f9..f1827162fe1 100644 --- a/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java +++ b/vector-stores/spring-ai-chroma-store/src/main/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStore.java @@ -218,7 +218,7 @@ public Optional doDelete(@NonNull List idList) { metadata.put(DocumentMetadata.DISTANCE.value(), distance); Document document = Document.builder() .id(id) - .content(content) + .text(content) .metadata(metadata) .score(1.0 - distance) .build(); diff --git a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreIT.java b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreIT.java index ee9689950e1..74ab85f5edb 100644 --- a/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreIT.java +++ b/vector-stores/spring-ai-chroma-store/src/test/java/org/springframework/ai/chroma/vectorstore/ChromaVectorStoreIT.java @@ -102,7 +102,7 @@ public void simpleSearch() { var document = Document.builder() .id("simpleDoc") - .content("The sky is blue because of Rayleigh scattering.") + .text("The sky is blue because of Rayleigh scattering.") .build(); vectorStore.add(List.of(document)); diff --git a/vector-stores/spring-ai-coherence-store/src/main/java/org/springframework/ai/vectorstore/CoherenceVectorStore.java b/vector-stores/spring-ai-coherence-store/src/main/java/org/springframework/ai/vectorstore/CoherenceVectorStore.java index 3bd9ddc4f07..ea065a7d49f 100644 --- a/vector-stores/spring-ai-coherence-store/src/main/java/org/springframework/ai/vectorstore/CoherenceVectorStore.java +++ b/vector-stores/spring-ai-coherence-store/src/main/java/org/springframework/ai/vectorstore/CoherenceVectorStore.java @@ -216,7 +216,7 @@ public List similaritySearch(SearchRequest request) { chunk.metadata().put(DocumentMetadata.DISTANCE.value(), r.getDistance()); documents.add(Document.builder() .id(id.docId()) - .content(chunk.text()) + .text(chunk.text()) .metadata(chunk.metadata()) .score(1 - r.getDistance()) .build()); diff --git a/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/GemFireVectorStore.java b/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/GemFireVectorStore.java index 494794ea669..76deb5af01d 100644 --- a/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/GemFireVectorStore.java +++ b/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/GemFireVectorStore.java @@ -273,7 +273,7 @@ public List doSimilaritySearch(SearchRequest request) { } metadata.put(DocumentMetadata.DISTANCE.value(), 1 - r.score); String content = (String) metadata.remove(DOCUMENT_FIELD); - return Document.builder().id(r.key).content(content).metadata(metadata).score((double) r.score).build(); + return Document.builder().id(r.key).text(content).metadata(metadata).score((double) r.score).build(); }) .collectList() .onErrorMap(WebClientException.class, this::handleHttpClientException) diff --git a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupHanaController.java b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupHanaController.java index 3a10995323b..7be97d1a946 100644 --- a/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupHanaController.java +++ b/vector-stores/spring-ai-hanadb-store/src/test/java/org/springframework/ai/vectorstore/CricketWorldCupHanaController.java @@ -90,7 +90,7 @@ public Map hanaVectorStoreSearch(@RequestParam("message") String var userMessage = new UserMessage(message); Prompt prompt = new Prompt(List.of(similarDocsMessage, userMessage)); - String generation = this.chatModel.call(prompt).getResult().getOutput().getContent(); + String generation = this.chatModel.call(prompt).getResult().getOutput().getText(); logger.info("Generation: {}", generation); return Map.of("generation", generation); } diff --git a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/MilvusVectorStore.java b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/MilvusVectorStore.java index e586797dce3..57704b4204f 100644 --- a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/MilvusVectorStore.java +++ b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/MilvusVectorStore.java @@ -268,7 +268,7 @@ public List doSimilaritySearch(SearchRequest request) { } return Document.builder() .id(docId) - .content(content) + .text(content) .metadata((metadata != null) ? metadata.getInnerMap() : Map.of()) .score((double) getResultSimilarity(rowRecord)) .build(); diff --git a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/MongoDBAtlasVectorStore.java b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/MongoDBAtlasVectorStore.java index 1ea36cb132a..96fec62234b 100644 --- a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/MongoDBAtlasVectorStore.java +++ b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/MongoDBAtlasVectorStore.java @@ -182,7 +182,7 @@ private Document mapMongoDocument(org.bson.Document mongoDocument, float[] query // @formatter:off return Document.builder() .id(id) - .content(content) + .text(content) .metadata(metadata) .score(score) .build(); // @formatter:on diff --git a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/Neo4jVectorStore.java b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/Neo4jVectorStore.java index 1a64f952d8a..989084504ee 100644 --- a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/Neo4jVectorStore.java +++ b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/Neo4jVectorStore.java @@ -236,7 +236,7 @@ private Document recordToDocument(org.neo4j.driver.Record neoRecord) { return Document.builder() .id(node.get(this.config.idProperty).asString()) - .content(node.get("text").asString()) + .text(node.get("text").asString()) .metadata(Map.copyOf(metaData)) .score((double) score) .build(); diff --git a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/OracleVectorStore.java b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/OracleVectorStore.java index 0f20d9a98ad..08d8e227e83 100644 --- a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/OracleVectorStore.java +++ b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/OracleVectorStore.java @@ -656,7 +656,7 @@ public Document mapRow(ResultSet rs, int rowNum) throws SQLException { return Document.builder() .id(rs.getString(1)) - .content(rs.getString(2)) + .text(rs.getString(2)) .metadata(metadata) .score(1 - rs.getDouble(5)) .build(); diff --git a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/PgVectorStore.java b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/PgVectorStore.java index a8a057c8dc2..f721a5cff4c 100644 --- a/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/PgVectorStore.java +++ b/vector-stores/spring-ai-pgvector-store/src/main/java/org/springframework/ai/vectorstore/PgVectorStore.java @@ -508,7 +508,7 @@ public Document mapRow(ResultSet rs, int rowNum) throws SQLException { // @formatter:off return Document.builder() .id(id) - .content(content) + .text(content) .metadata(metadata) .score(1.0 - distance) .build(); // @formatter:on diff --git a/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/PgVectorStoreWithChatMemoryAdvisorIT.java b/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/PgVectorStoreWithChatMemoryAdvisorIT.java index 6325ac71810..0765e9cab79 100644 --- a/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/PgVectorStoreWithChatMemoryAdvisorIT.java +++ b/vector-stores/spring-ai-pgvector-store/src/test/java/org/springframework/ai/vectorstore/PgVectorStoreWithChatMemoryAdvisorIT.java @@ -104,7 +104,7 @@ private static void verifyRequestHasBeenAdvisedWithMessagesFromVectorStore(ChatM ArgumentCaptor promptCaptor = ArgumentCaptor.forClass(Prompt.class); verify(chatModel).call(promptCaptor.capture()); assertThat(promptCaptor.getValue().getInstructions().get(0)).isInstanceOf(SystemMessage.class); - assertThat(promptCaptor.getValue().getInstructions().get(0).getContent()).isEqualTo(""" + assertThat(promptCaptor.getValue().getInstructions().get(0).getText()).isEqualTo(""" Use the long term conversation memory from the LONG_TERM_MEMORY section to provide accurate answers. diff --git a/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/PineconeVectorStore.java b/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/PineconeVectorStore.java index b973ae448e5..dbd312f5740 100644 --- a/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/PineconeVectorStore.java +++ b/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/PineconeVectorStore.java @@ -239,7 +239,7 @@ public List similaritySearch(SearchRequest request, String namespace) metadata.put(this.pineconeDistanceMetadataFieldName, 1 - scoredVector.getScore()); return Document.builder() .id(id) - .content(content) + .text(content) .metadata(metadata) .score((double) scoredVector.getScore()) .build(); diff --git a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java index 98c3a5c8bd4..a5d5ec7484e 100644 --- a/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java +++ b/vector-stores/spring-ai-qdrant-store/src/main/java/org/springframework/ai/vectorstore/qdrant/QdrantVectorStore.java @@ -214,12 +214,7 @@ private Document toDocument(ScoredPoint point) { var content = (String) metadata.remove(CONTENT_FIELD_NAME); - return Document.builder() - .id(id) - .content(content) - .metadata(metadata) - .score((double) point.getScore()) - .build(); + return Document.builder().id(id).text(content).metadata(metadata).score((double) point.getScore()).build(); } catch (Exception e) { throw new RuntimeException(e); diff --git a/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java index 1397585d30f..8415f8dfa0f 100644 --- a/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java +++ b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/RedisVectorStore.java @@ -250,12 +250,7 @@ private Document toDocument(redis.clients.jedis.search.Document doc) { // distance. Can we remove this after standardizing the metadata? metadata.put(DISTANCE_FIELD_NAME, 1 - similarityScore(doc)); metadata.put(DocumentMetadata.DISTANCE.value(), 1 - similarityScore(doc)); - return Document.builder() - .id(id) - .content(content) - .metadata(metadata) - .score((double) similarityScore(doc)) - .build(); + return Document.builder().id(id).text(content).metadata(metadata).score((double) similarityScore(doc)).build(); } private float similarityScore(redis.clients.jedis.search.Document doc) { diff --git a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseVectorStore.java b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseVectorStore.java index 514364f2d21..9bcfaa5edda 100644 --- a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseVectorStore.java +++ b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/TypesenseVectorStore.java @@ -218,7 +218,7 @@ public List doSimilaritySearch(SearchRequest request) { metadata.put(DocumentMetadata.DISTANCE.value(), hit.getVectorDistance()); return Document.builder() .id(docId) - .content(content) + .text(content) .metadata(metadata) .score(1.0 - hit.getVectorDistance()) .build(); diff --git a/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/WeaviateVectorStore.java b/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/WeaviateVectorStore.java index 00a4a35201d..cd2110f4ff5 100644 --- a/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/WeaviateVectorStore.java +++ b/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/WeaviateVectorStore.java @@ -387,7 +387,7 @@ private Document toDocument(Map item) { // @formatter:off return Document.builder() .id(id) - .content(content) + .text(content) .metadata(metadata) .score(certainty) .build(); // @formatter:on