diff --git a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/agent/OpenAiDefaultChatAgentIT.java b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/agent/OpenAiDefaultChatAgentIT.java index 1daf55a78..e92d6530e 100644 --- a/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/agent/OpenAiDefaultChatAgentIT.java +++ b/models/spring-ai-openai/src/test/java/org/springframework/ai/openai/chat/agent/OpenAiDefaultChatAgentIT.java @@ -5,11 +5,11 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.agent.ChatAgent; import org.springframework.ai.chat.agent.DefaultChatAgent; -import org.springframework.ai.chat.transformer.QuestionContextAugmentor; -import org.springframework.ai.chat.transformer.VectorStoreRetriever; +import org.springframework.ai.chat.prompt.transformer.QuestionContextAugmentor; +import org.springframework.ai.chat.prompt.transformer.VectorStoreRetriever; import org.springframework.ai.chat.messages.UserMessage; import org.springframework.ai.chat.prompt.Prompt; -import org.springframework.ai.chat.transformer.PromptContext; +import org.springframework.ai.chat.prompt.transformer.PromptContext; import org.springframework.ai.embedding.EmbeddingClient; import org.springframework.ai.evaluation.EvaluationRequest; import org.springframework.ai.evaluation.EvaluationResponse; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/AgentResponse.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/AgentResponse.java index 112caaf51..21fe6eccf 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/AgentResponse.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/AgentResponse.java @@ -1,7 +1,7 @@ package org.springframework.ai.chat.agent; import org.springframework.ai.chat.ChatResponse; -import org.springframework.ai.chat.transformer.PromptContext; +import org.springframework.ai.chat.prompt.transformer.PromptContext; import java.util.Objects; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/ChatAgent.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/ChatAgent.java index 20100fb11..de9a4e3fa 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/ChatAgent.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/ChatAgent.java @@ -1,6 +1,6 @@ package org.springframework.ai.chat.agent; -import org.springframework.ai.chat.transformer.PromptContext; +import org.springframework.ai.chat.prompt.transformer.PromptContext; /** * A ChatAgent encapsulates common AI workflows such as Retrieval Augmented Generation. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/DefaultChatAgent.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/DefaultChatAgent.java index 59cd26a68..9c7a40e27 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/DefaultChatAgent.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/agent/DefaultChatAgent.java @@ -2,8 +2,8 @@ package org.springframework.ai.chat.agent; import org.springframework.ai.chat.ChatClient; import org.springframework.ai.chat.ChatResponse; -import org.springframework.ai.chat.transformer.PromptContext; -import org.springframework.ai.chat.transformer.PromptTransformer; +import org.springframework.ai.chat.prompt.transformer.PromptContext; +import org.springframework.ai.chat.prompt.transformer.PromptTransformer; import java.util.ArrayList; import java.util.List; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/Message.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/Message.java index e25f1271d..ba5645815 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/Message.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/Message.java @@ -32,8 +32,6 @@ public interface Message extends Node { String getContent(); - List getMedia(); - MessageType getMessageType(); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/PromptContext.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/PromptContext.java similarity index 89% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/PromptContext.java rename to spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/PromptContext.java index 706ffcdbf..8c8415d98 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/PromptContext.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/PromptContext.java @@ -1,12 +1,9 @@ -package org.springframework.ai.chat.transformer; +package org.springframework.ai.chat.prompt.transformer; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.node.Node; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; +import java.util.*; /** * The shared, at the moment, mutable, data structure that can be used to implement @@ -19,13 +16,13 @@ public class PromptContext { private Prompt prompt; // The most up-to-date prompt to use - List> nodes; // The most up-to-date data to use + private List> nodes; // The most up-to-date data to use private List promptHistory; private String conversationId; - private Map metadata; + private Map metadata = new HashMap<>(); public PromptContext(Prompt prompt) { this(prompt, new ArrayList<>()); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/PromptTransformer.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/PromptTransformer.java similarity index 90% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/PromptTransformer.java rename to spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/PromptTransformer.java index c508bc6e1..b6fd2a91e 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/PromptTransformer.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/PromptTransformer.java @@ -1,4 +1,4 @@ -package org.springframework.ai.chat.transformer; +package org.springframework.ai.chat.prompt.transformer; /** * Responsible for transforming a Prompt. The PromptContext contains the necessary data to diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/QuestionContextAugmentor.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/QuestionContextAugmentor.java similarity index 94% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/QuestionContextAugmentor.java rename to spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/QuestionContextAugmentor.java index 6712344ad..af23e1d28 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/QuestionContextAugmentor.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/QuestionContextAugmentor.java @@ -1,12 +1,10 @@ -package org.springframework.ai.chat.transformer; +package org.springframework.ai.chat.prompt.transformer; -import org.springframework.ai.chat.transformer.PromptContext; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.MessageType; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.chat.prompt.PromptTemplate; -import org.springframework.ai.chat.transformer.PromptTransformer; import org.springframework.ai.document.Document; import org.springframework.ai.node.Node; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/VectorStoreRetriever.java b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/VectorStoreRetriever.java similarity index 97% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/VectorStoreRetriever.java rename to spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/VectorStoreRetriever.java index 625d53594..f59c858f7 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/transformer/VectorStoreRetriever.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/transformer/VectorStoreRetriever.java @@ -1,4 +1,4 @@ -package org.springframework.ai.chat.transformer; +package org.springframework.ai.chat.prompt.transformer; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.MessageType; 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 8727024eb..e8f1be530 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 @@ -25,6 +25,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonProperty; +import org.springframework.ai.chat.messages.Media; import org.springframework.ai.document.id.IdGenerator; import org.springframework.ai.document.id.RandomIdGenerator; import org.springframework.ai.node.Node; @@ -55,6 +56,8 @@ public class Document implements Node { */ private String content; + private List media; + /** * Embedding of the document. Note: ephemeral field. */ @@ -81,12 +84,17 @@ public class Document implements Node { } public Document(String id, String content, Map metadata) { + this(id, content, List.of(), metadata); + } + + public Document(String id, String content, List media, Map metadata) { Assert.hasText(id, "id must not be null"); Assert.hasText(content, "content must not be null"); Assert.notNull(metadata, "metadata must not be null"); this.id = id; this.content = content; + this.media = media; this.metadata = metadata; } @@ -99,6 +107,11 @@ public class Document implements Node { return this.content; } + @Override + public List getMedia() { + return this.media; + } + @JsonIgnore public String getFormattedContent() { return this.getFormattedContent(MetadataMode.ALL); diff --git a/spring-ai-core/src/main/java/org/springframework/ai/node/Node.java b/spring-ai-core/src/main/java/org/springframework/ai/node/Node.java index 54586292f..68f4ec6ac 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/node/Node.java +++ b/spring-ai-core/src/main/java/org/springframework/ai/node/Node.java @@ -1,5 +1,8 @@ package org.springframework.ai.node; +import org.springframework.ai.chat.messages.Media; + +import java.util.List; import java.util.Map; /** @@ -13,6 +16,8 @@ public interface Node { T getContent(); + List getMedia(); + Map getMetadata(); }