diff --git a/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java b/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java index 979e50b238f..0accbe62cfc 100644 --- a/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java +++ b/advisors/spring-ai-advisors-vector-store/src/main/java/org/springframework/ai/chat/client/advisor/vectorstore/QuestionAnswerAdvisor.java @@ -83,17 +83,6 @@ public class QuestionAnswerAdvisor implements BaseAdvisor { private final int order; - /** - * Construct instance by given VectorStore - * @param vectorStore the given VectorStore - * @deprecated in favor of {@link #builder(VectorStore)}} - */ - @Deprecated - public QuestionAnswerAdvisor(VectorStore vectorStore) { - this(vectorStore, SearchRequest.builder().build(), DEFAULT_PROMPT_TEMPLATE, BaseAdvisor.DEFAULT_SCHEDULER, - DEFAULT_ORDER); - } - QuestionAnswerAdvisor(VectorStore vectorStore, SearchRequest searchRequest, @Nullable PromptTemplate promptTemplate, @Nullable Scheduler scheduler, int order) { Assert.notNull(vectorStore, "vectorStore cannot be null"); diff --git a/auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/embedding/VertexAiTextEmbeddingModelAutoConfigurationIT.java b/auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/embedding/VertexAiTextEmbeddingModelAutoConfigurationIT.java index 467be5f1b69..5a1addf3937 100644 --- a/auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/embedding/VertexAiTextEmbeddingModelAutoConfigurationIT.java +++ b/auto-configurations/models/spring-ai-autoconfigure-model-vertex-ai/src/test/java/org/springframework/ai/model/vertexai/autoconfigure/embedding/VertexAiTextEmbeddingModelAutoConfigurationIT.java @@ -25,7 +25,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.embedding.DocumentEmbeddingRequest; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.embedding.EmbeddingResponse; import org.springframework.ai.embedding.EmbeddingResultMetadata; import org.springframework.ai.utils.SpringAiTestAutoConfigurations; @@ -118,7 +118,7 @@ public void multimodalEmbedding() { var document = new Document("Hello World"); DocumentEmbeddingRequest embeddingRequest = new DocumentEmbeddingRequest(List.of(document), - EmbeddingOptionsBuilder.builder().build()); + EmbeddingOptions.builder().build()); EmbeddingResponse embeddingResponse = multiModelEmbeddingModel.call(embeddingRequest); assertThat(embeddingResponse.getResults()).hasSize(1); diff --git a/memory/repository/spring-ai-model-chat-memory-repository-cosmos-db/src/main/java/org/springframework/ai/chat/memory/repository/cosmosdb/CosmosDBChatMemoryRepository.java b/memory/repository/spring-ai-model-chat-memory-repository-cosmos-db/src/main/java/org/springframework/ai/chat/memory/repository/cosmosdb/CosmosDBChatMemoryRepository.java index db5db140346..c9edd8e4862 100644 --- a/memory/repository/spring-ai-model-chat-memory-repository-cosmos-db/src/main/java/org/springframework/ai/chat/memory/repository/cosmosdb/CosmosDBChatMemoryRepository.java +++ b/memory/repository/spring-ai-model-chat-memory-repository-cosmos-db/src/main/java/org/springframework/ai/chat/memory/repository/cosmosdb/CosmosDBChatMemoryRepository.java @@ -232,7 +232,7 @@ private Message mapToMessage(Map doc) { } return switch (messageType) { - case ASSISTANT -> new AssistantMessage(content, metadata); + case ASSISTANT -> AssistantMessage.builder().content(content).properties(metadata).build(); case USER -> UserMessage.builder().text(content).metadata(metadata).build(); case SYSTEM -> SystemMessage.builder().text(content).metadata(metadata).build(); case TOOL -> ToolResponseMessage.builder().responses(List.of()).metadata(metadata).build(); diff --git a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingOptions.java b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingOptions.java index 186d2743f59..cfd1a24d799 100644 --- a/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingOptions.java +++ b/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingOptions.java @@ -66,11 +66,6 @@ public static final class Builder { private BedrockTitanEmbeddingOptions options = new BedrockTitanEmbeddingOptions(); - @Deprecated - public Builder withInputType(InputType inputType) { - return this.inputType(inputType); - } - public Builder inputType(InputType inputType) { Assert.notNull(inputType, "input type can not be null."); diff --git a/models/spring-ai-deepseek/src/main/java/org/springframework/ai/deepseek/DeepSeekAssistantMessage.java b/models/spring-ai-deepseek/src/main/java/org/springframework/ai/deepseek/DeepSeekAssistantMessage.java index d72f10215c1..8ebb73c93f6 100644 --- a/models/spring-ai-deepseek/src/main/java/org/springframework/ai/deepseek/DeepSeekAssistantMessage.java +++ b/models/spring-ai-deepseek/src/main/java/org/springframework/ai/deepseek/DeepSeekAssistantMessage.java @@ -34,57 +34,6 @@ public class DeepSeekAssistantMessage extends AssistantMessage { private String reasoningContent; - /** - * @deprecated in favor of {@link DeepSeekAssistantMessage.Builder} - */ - @Deprecated - public DeepSeekAssistantMessage(String content) { - super(content); - } - - /** - * @deprecated in favor of {@link DeepSeekAssistantMessage.Builder} - */ - @Deprecated - public DeepSeekAssistantMessage(String content, String reasoningContent) { - super(content); - this.reasoningContent = reasoningContent; - } - - /** - * @deprecated in favor of {@link DeepSeekAssistantMessage.Builder} - */ - @Deprecated - public DeepSeekAssistantMessage(String content, Map properties) { - super(content, properties); - } - - /** - * @deprecated in favor of {@link DeepSeekAssistantMessage.Builder} - */ - @Deprecated - public DeepSeekAssistantMessage(String content, Map properties, List toolCalls) { - super(content, properties, toolCalls); - } - - /** - * @deprecated in favor of {@link DeepSeekAssistantMessage.Builder} - */ - @Deprecated - public DeepSeekAssistantMessage(String content, String reasoningContent, Map properties, - List toolCalls) { - this(content, reasoningContent, properties, toolCalls, List.of()); - } - - /** - * @deprecated in favor of {@link DeepSeekAssistantMessage.Builder} - */ - @Deprecated - public DeepSeekAssistantMessage(String content, String reasoningContent, Map properties, - List toolCalls, List media) { - this(content, reasoningContent, null, properties, toolCalls, media); - } - protected DeepSeekAssistantMessage(String content, String reasoningContent, Boolean prefix, Map properties, List toolCalls, List media) { super(content, properties, toolCalls, media); diff --git a/models/spring-ai-deepseek/src/test/java/org/springframework/ai/deepseek/DeepSeekAssistantMessageTests.java b/models/spring-ai-deepseek/src/test/java/org/springframework/ai/deepseek/DeepSeekAssistantMessageTests.java index 74d8ea86a73..c389d894df4 100644 --- a/models/spring-ai-deepseek/src/test/java/org/springframework/ai/deepseek/DeepSeekAssistantMessageTests.java +++ b/models/spring-ai-deepseek/src/test/java/org/springframework/ai/deepseek/DeepSeekAssistantMessageTests.java @@ -38,7 +38,7 @@ class DeepSeekAssistantMessageTests { @Test public void testConstructorWithContentOnly() { String content = "Hello, world!"; - DeepSeekAssistantMessage message = new DeepSeekAssistantMessage(content); + DeepSeekAssistantMessage message = new DeepSeekAssistantMessage.Builder().content(content).build(); assertThat(message.getText()).isEqualTo(content); assertThat(message.getReasoningContent()).isNull(); @@ -49,7 +49,9 @@ public void testConstructorWithContentOnly() { public void testConstructorWithContentAndReasoningContent() { String content = "Hello, world!"; String reasoningContent = "This is my reasoning"; - DeepSeekAssistantMessage message = new DeepSeekAssistantMessage(content, reasoningContent); + DeepSeekAssistantMessage message = new DeepSeekAssistantMessage.Builder().content(content) + .reasoningContent(reasoningContent) + .build(); assertThat(message.getText()).isEqualTo(content); assertThat(message.getReasoningContent()).isEqualTo(reasoningContent); @@ -63,7 +65,9 @@ public void testConstructorWithContentAndProperties() { properties.put("key1", "value1"); properties.put("key2", 123); - DeepSeekAssistantMessage message = new DeepSeekAssistantMessage(content, properties); + DeepSeekAssistantMessage message = new DeepSeekAssistantMessage.Builder().content(content) + .properties(properties) + .build(); assertThat(message.getText()).isEqualTo(content); assertThat(message.getMetadata()).containsAllEntriesOf(properties); @@ -79,7 +83,10 @@ public void testConstructorWithContentPropertiesAndToolCalls() { List toolCalls = List.of(new ToolCall("1", "function", "myFunction", "{}")); - DeepSeekAssistantMessage message = new DeepSeekAssistantMessage(content, properties, toolCalls); + DeepSeekAssistantMessage message = new DeepSeekAssistantMessage.Builder().content(content) + .properties(properties) + .toolCalls(toolCalls) + .build(); assertThat(message.getText()).isEqualTo(content); assertThat(message.getMetadata()).containsAllEntriesOf(properties); @@ -97,8 +104,12 @@ public void testConstructorWithAllParameters() { properties.put("key1", "value1"); List toolCalls = List.of(new ToolCall("1", "function", "myFunction", "{}")); - DeepSeekAssistantMessage message = new DeepSeekAssistantMessage(content, reasoningContent, prefix, properties, - toolCalls, List.of()); + DeepSeekAssistantMessage message = new DeepSeekAssistantMessage.Builder().content(content) + .reasoningContent(reasoningContent) + .properties(properties) + .toolCalls(toolCalls) + .prefix(prefix) + .build(); assertThat(message.getText()).isEqualTo(content); assertThat(message.getReasoningContent()).isEqualTo(reasoningContent); @@ -128,7 +139,7 @@ public void testPrefixAssistantMessageFactoryMethodWithReasoning() { @Test public void testSettersAndGetters() { - DeepSeekAssistantMessage message = new DeepSeekAssistantMessage("test"); + DeepSeekAssistantMessage message = new DeepSeekAssistantMessage.Builder().build(); String reasoningContent = "New reasoning content"; Boolean prefix = false; @@ -157,7 +168,9 @@ public void testEqualsAndHashCode() { @Test public void testToString() { - DeepSeekAssistantMessage message = new DeepSeekAssistantMessage("content", "reasoning"); + DeepSeekAssistantMessage message = new DeepSeekAssistantMessage.Builder().content("content") + .reasoningContent("reasoning") + .build(); message.setPrefix(true); assertThatNoException().isThrownBy(message::toString); diff --git a/models/spring-ai-deepseek/src/test/java/org/springframework/ai/deepseek/chat/DeepSeekChatModelIT.java b/models/spring-ai-deepseek/src/test/java/org/springframework/ai/deepseek/chat/DeepSeekChatModelIT.java index 1bd8067ee6d..edb92a4f98a 100644 --- a/models/spring-ai-deepseek/src/test/java/org/springframework/ai/deepseek/chat/DeepSeekChatModelIT.java +++ b/models/spring-ai-deepseek/src/test/java/org/springframework/ai/deepseek/chat/DeepSeekChatModelIT.java @@ -224,7 +224,9 @@ void prefixCompletionTest() { ``` """; UserMessage userMessage = new UserMessage(userMessageContent); - Message assistantMessage = new DeepSeekAssistantMessage("{\"code\":200,\"result\":{\"total\":1,\"data\":[1"); + Message assistantMessage = AssistantMessage.builder() + .content("{\"code\":200,\"result\":{\"total\":1,\"data\":[1") + .build(); Prompt prompt = new Prompt(List.of(userMessage, assistantMessage)); ChatResponse response = this.chatModel.call(prompt); assertThat(response.getResult().getOutput().getText().equals(",2,3]}}")); 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 f7314603ec3..25838ae808b 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 @@ -127,14 +127,6 @@ public class MistralAiChatModel implements ChatModel { */ private ChatModelObservationConvention observationConvention = DEFAULT_OBSERVATION_CONVENTION; - @Deprecated - public MistralAiChatModel(MistralAiApi mistralAiApi, MistralAiChatOptions defaultOptions, - ToolCallingManager toolCallingManager, RetryTemplate retryTemplate, - ObservationRegistry observationRegistry) { - this(mistralAiApi, defaultOptions, toolCallingManager, retryTemplate, observationRegistry, - new DefaultToolExecutionEligibilityPredicate()); - } - public MistralAiChatModel(MistralAiApi mistralAiApi, MistralAiChatOptions defaultOptions, ToolCallingManager toolCallingManager, RetryTemplate retryTemplate, ObservationRegistry observationRegistry, ToolExecutionEligibilityPredicate toolExecutionEligibilityPredicate) { diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java index 8650fca10b7..76b71e93030 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/MistralAiEmbeddingModel.java @@ -85,29 +85,6 @@ public class MistralAiEmbeddingModel extends AbstractEmbeddingModel { */ private EmbeddingModelObservationConvention observationConvention = DEFAULT_OBSERVATION_CONVENTION; - @Deprecated - public MistralAiEmbeddingModel(MistralAiApi mistralAiApi) { - this(mistralAiApi, MetadataMode.EMBED); - } - - @Deprecated - public MistralAiEmbeddingModel(MistralAiApi mistralAiApi, MetadataMode metadataMode) { - this(mistralAiApi, metadataMode, - MistralAiEmbeddingOptions.builder().withModel(MistralAiApi.EmbeddingModel.EMBED.getValue()).build(), - RetryUtils.DEFAULT_RETRY_TEMPLATE); - } - - @Deprecated - public MistralAiEmbeddingModel(MistralAiApi mistralAiApi, MistralAiEmbeddingOptions options) { - this(mistralAiApi, MetadataMode.EMBED, options, RetryUtils.DEFAULT_RETRY_TEMPLATE); - } - - @Deprecated - public MistralAiEmbeddingModel(MistralAiApi mistralAiApi, MetadataMode metadataMode, - MistralAiEmbeddingOptions options, RetryTemplate retryTemplate) { - this(mistralAiApi, metadataMode, options, retryTemplate, ObservationRegistry.NOOP); - } - public MistralAiEmbeddingModel(MistralAiApi mistralAiApi, MetadataMode metadataMode, MistralAiEmbeddingOptions options, RetryTemplate retryTemplate, ObservationRegistry observationRegistry) { Assert.notNull(mistralAiApi, "mistralAiApi must not be null"); diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/api/MistralAiApi.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/api/MistralAiApi.java index 3938087e820..e55987e91f2 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/api/MistralAiApi.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/api/MistralAiApi.java @@ -83,38 +83,6 @@ public static Builder builder() { private final MistralAiStreamFunctionCallingHelper chunkMerger = new MistralAiStreamFunctionCallingHelper(); - /** - * Create a new client api with DEFAULT_BASE_URL - * @param apiKey Mistral api Key. - */ - @Deprecated - public MistralAiApi(String apiKey) { - this(DEFAULT_BASE_URL, apiKey); - } - - /** - * Create a new client api. - * @param baseUrl api base URL. - * @param apiKey Mistral api Key. - */ - @Deprecated - public MistralAiApi(String baseUrl, String apiKey) { - this(baseUrl, apiKey, RestClient.builder(), RetryUtils.DEFAULT_RESPONSE_ERROR_HANDLER); - } - - /** - * Create a new client api. - * @param baseUrl api base URL. - * @param apiKey Mistral api Key. - * @param restClientBuilder RestClient builder. - * @param responseErrorHandler Response error handler. - */ - @Deprecated - public MistralAiApi(String baseUrl, String apiKey, RestClient.Builder restClientBuilder, - ResponseErrorHandler responseErrorHandler) { - this(baseUrl, apiKey, restClientBuilder, WebClient.builder(), responseErrorHandler); - } - /** * Create a new client api. * @param baseUrl api base URL. diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/api/MistralAiModerationApi.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/api/MistralAiModerationApi.java index 131c0e82462..fb08f931610 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/api/MistralAiModerationApi.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/api/MistralAiModerationApi.java @@ -42,11 +42,6 @@ public class MistralAiModerationApi { private final RestClient restClient; - @Deprecated - public MistralAiModerationApi(String apiKey) { - this(DEFAULT_BASE_URL, apiKey, RestClient.builder(), RetryUtils.DEFAULT_RESPONSE_ERROR_HANDLER); - } - public MistralAiModerationApi(String baseUrl, String apiKey, RestClient.Builder restClientBuilder, ResponseErrorHandler responseErrorHandler) { diff --git a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/moderation/MistralAiModerationModel.java b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/moderation/MistralAiModerationModel.java index 0717520d766..404cd559462 100644 --- a/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/moderation/MistralAiModerationModel.java +++ b/models/spring-ai-mistral-ai/src/main/java/org/springframework/ai/mistralai/moderation/MistralAiModerationModel.java @@ -56,19 +56,6 @@ public class MistralAiModerationModel implements ModerationModel { private final MistralAiModerationOptions defaultOptions; - @Deprecated - public MistralAiModerationModel(MistralAiModerationApi mistralAiModerationApi) { - this(mistralAiModerationApi, RetryUtils.DEFAULT_RETRY_TEMPLATE, - MistralAiModerationOptions.builder() - .model(MistralAiModerationApi.Model.MISTRAL_MODERATION.getValue()) - .build()); - } - - @Deprecated - public MistralAiModerationModel(MistralAiModerationApi mistralAiModerationApi, MistralAiModerationOptions options) { - this(mistralAiModerationApi, RetryUtils.DEFAULT_RETRY_TEMPLATE, options); - } - public MistralAiModerationModel(MistralAiModerationApi mistralAiModerationApi, RetryTemplate retryTemplate, MistralAiModerationOptions options) { Assert.notNull(mistralAiModerationApi, "mistralAiModerationApi must not be null"); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatCompletionRequestTests.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatCompletionRequestTests.java index 2751b1388cb..c770d63dca6 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatCompletionRequestTests.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiChatCompletionRequestTests.java @@ -61,7 +61,7 @@ class MistralAiChatCompletionRequestTests { private static final Media IMAGE_MEDIA = new Media(Media.Format.IMAGE_PNG, URI.create(IMAGE_URL)); private final MistralAiChatModel chatModel = MistralAiChatModel.builder() - .mistralAiApi(new MistralAiApi(BASE_URL, API_KEY)) + .mistralAiApi(MistralAiApi.builder().baseUrl(BASE_URL).apiKey(API_KEY).build()) .build(); @Test @@ -100,7 +100,7 @@ void whenToolRuntimeOptionsThenMergeWithDefaults() { .build(); MistralAiChatModel anotherChatModel = MistralAiChatModel.builder() - .mistralAiApi(new MistralAiApi(BASE_URL, API_KEY)) + .mistralAiApi(MistralAiApi.builder().baseUrl(BASE_URL).apiKey(API_KEY).build()) .defaultOptions(defaultOptions) .build(); diff --git a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiEmbeddingModelTests.java b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiEmbeddingModelTests.java index 1ac71e276e0..f771e59a89b 100644 --- a/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiEmbeddingModelTests.java +++ b/models/spring-ai-mistral-ai/src/test/java/org/springframework/ai/mistralai/MistralAiEmbeddingModelTests.java @@ -45,8 +45,12 @@ void testDimensionsForMistralEmbedModel() { .withModel(MistralAiApi.EmbeddingModel.EMBED.getValue()) .build(); - MistralAiEmbeddingModel model = new MistralAiEmbeddingModel(mockApi, MetadataMode.EMBED, options, - RetryUtils.DEFAULT_RETRY_TEMPLATE); + MistralAiEmbeddingModel model = MistralAiEmbeddingModel.builder() + .mistralAiApi(mockApi) + .metadataMode(MetadataMode.EMBED) + .options(options) + .retryTemplate(RetryUtils.DEFAULT_RETRY_TEMPLATE) + .build(); assertThat(model.dimensions()).isEqualTo(1024); } @@ -59,8 +63,12 @@ void testDimensionsForCodestralEmbedModel() { .withModel(MistralAiApi.EmbeddingModel.CODESTRAL_EMBED.getValue()) .build(); - MistralAiEmbeddingModel model = new MistralAiEmbeddingModel(mockApi, MetadataMode.EMBED, options, - RetryUtils.DEFAULT_RETRY_TEMPLATE); + MistralAiEmbeddingModel model = MistralAiEmbeddingModel.builder() + .mistralAiApi(mockApi) + .metadataMode(MetadataMode.EMBED) + .options(options) + .retryTemplate(RetryUtils.DEFAULT_RETRY_TEMPLATE) + .build(); assertThat(model.dimensions()).isEqualTo(1536); } @@ -72,8 +80,12 @@ void testDimensionsFallbackForUnknownModel() { // Use a model name that doesn't exist in KNOWN_EMBEDDING_DIMENSIONS MistralAiEmbeddingOptions options = MistralAiEmbeddingOptions.builder().withModel("unknown-model").build(); - MistralAiEmbeddingModel model = new MistralAiEmbeddingModel(mockApi, MetadataMode.EMBED, options, - RetryUtils.DEFAULT_RETRY_TEMPLATE); + MistralAiEmbeddingModel model = MistralAiEmbeddingModel.builder() + .mistralAiApi(mockApi) + .metadataMode(MetadataMode.EMBED) + .options(options) + .retryTemplate(RetryUtils.DEFAULT_RETRY_TEMPLATE) + .build(); // Should fall back to super.dimensions() which detects dimensions from the API // response @@ -93,8 +105,12 @@ void testAllEmbeddingModelsHaveDimensionMapping() { .withModel(embeddingModel.getValue()) .build(); - MistralAiEmbeddingModel model = new MistralAiEmbeddingModel(mockApi, MetadataMode.EMBED, options, - RetryUtils.DEFAULT_RETRY_TEMPLATE); + MistralAiEmbeddingModel model = MistralAiEmbeddingModel.builder() + .mistralAiApi(mockApi) + .metadataMode(MetadataMode.EMBED) + .options(options) + .retryTemplate(RetryUtils.DEFAULT_RETRY_TEMPLATE) + .build(); // Each model should have a valid dimension (not the fallback -1) assertThat(model.dimensions()).as("Model %s should have a dimension mapping", embeddingModel.getValue()) 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 7cb87eb8f3b..6ff3e2ba657 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 @@ -62,7 +62,6 @@ import org.springframework.ai.ollama.api.OllamaApi.Message.ToolCallFunction; import org.springframework.ai.ollama.api.OllamaChatOptions; import org.springframework.ai.ollama.api.OllamaModel; -import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.ollama.api.common.OllamaApiConstants; import org.springframework.ai.ollama.management.ModelManagementOptions; import org.springframework.ai.ollama.management.OllamaModelManager; @@ -399,8 +398,8 @@ Prompt buildRequestPrompt(Prompt prompt) { // Process runtime options OllamaChatOptions runtimeOptions = null; if (prompt.getOptions() != null) { - if (prompt.getOptions() instanceof OllamaOptions ollamaOptions) { - runtimeOptions = ModelOptionsUtils.copyToTarget(OllamaChatOptions.fromOptions(ollamaOptions), + if (prompt.getOptions() instanceof OllamaChatOptions ollamaChatOptions) { + runtimeOptions = ModelOptionsUtils.copyToTarget(OllamaChatOptions.fromOptions(ollamaChatOptions), OllamaChatOptions.class, OllamaChatOptions.class); } else if (prompt.getOptions() instanceof ToolCallingChatOptions toolCallingChatOptions) { @@ -499,7 +498,7 @@ else if (message.getMessageType() == MessageType.TOOL) { requestOptions = (OllamaChatOptions) prompt.getOptions(); } else { - requestOptions = OllamaChatOptions.fromOptions((OllamaOptions) prompt.getOptions()); + requestOptions = OllamaChatOptions.fromOptions((OllamaChatOptions) prompt.getOptions()); } OllamaApi.ChatRequest.Builder requestBuilder = OllamaApi.ChatRequest.builder(requestOptions.getModel()) @@ -591,12 +590,6 @@ public Builder ollamaApi(OllamaApi ollamaApi) { return this; } - @Deprecated - public Builder defaultOptions(OllamaOptions defaultOptions) { - this.defaultOptions = OllamaChatOptions.fromOptions(defaultOptions); - return this; - } - public Builder defaultOptions(OllamaChatOptions defaultOptions) { this.defaultOptions = defaultOptions; return this; diff --git a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaEmbeddingModel.java b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaEmbeddingModel.java index f00edc7314d..cce29d9c2bb 100644 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaEmbeddingModel.java +++ b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/OllamaEmbeddingModel.java @@ -40,7 +40,6 @@ import org.springframework.ai.ollama.api.OllamaApi.EmbeddingsResponse; import org.springframework.ai.ollama.api.OllamaEmbeddingOptions; import org.springframework.ai.ollama.api.OllamaModel; -import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.ollama.api.common.OllamaApiConstants; import org.springframework.ai.ollama.management.ModelManagementOptions; import org.springframework.ai.ollama.management.OllamaModelManager; @@ -171,7 +170,7 @@ OllamaApi.EmbeddingsRequest ollamaEmbeddingRequest(EmbeddingRequest embeddingReq requestOptions = (OllamaEmbeddingOptions) embeddingRequest.getOptions(); } else { - requestOptions = OllamaEmbeddingOptions.fromOptions((OllamaOptions) embeddingRequest.getOptions()); + requestOptions = OllamaEmbeddingOptions.fromOptions((OllamaEmbeddingOptions) embeddingRequest.getOptions()); } return new OllamaApi.EmbeddingsRequest(requestOptions.getModel(), embeddingRequest.getInstructions(), @@ -217,12 +216,6 @@ public Builder ollamaApi(OllamaApi ollamaApi) { return this; } - @Deprecated - public Builder defaultOptions(OllamaOptions defaultOptions) { - this.defaultOptions = OllamaEmbeddingOptions.fromOptions(defaultOptions); - return this; - } - public Builder defaultOptions(OllamaEmbeddingOptions defaultOptions) { this.defaultOptions = defaultOptions; return this; diff --git a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaApi.java b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaApi.java index 7f3b56c7e53..2d6f30ceeeb 100644 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaApi.java +++ b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaApi.java @@ -510,7 +510,7 @@ public Builder tools(List tools) { public Builder options(Map options) { Objects.requireNonNull(options, "The options can not be null."); - this.options = OllamaOptions.filterNonSupportedFields(options); + this.options = OllamaChatOptions.filterNonSupportedFields(options); return this; } @@ -519,13 +519,6 @@ public Builder think(Boolean think) { return this; } - @Deprecated - public Builder options(OllamaOptions options) { - Objects.requireNonNull(options, "The options can not be null."); - this.options = OllamaOptions.filterNonSupportedFields(options.toMap()); - return this; - } - public Builder options(OllamaChatOptions options) { Objects.requireNonNull(options, "The options can not be null."); this.options = OllamaChatOptions.filterNonSupportedFields(options.toMap()); diff --git a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaChatOptions.java b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaChatOptions.java index 2bcbce8101a..c3d3422d96a 100644 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaChatOptions.java +++ b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaChatOptions.java @@ -400,48 +400,6 @@ public static OllamaChatOptions fromOptions(OllamaChatOptions fromOptions) { .toolContext(fromOptions.getToolContext()).build(); } - public static OllamaChatOptions fromOptions(OllamaOptions fromOptions) { - return builder() - .model(fromOptions.getModel()) - .format(fromOptions.getFormat()) - .keepAlive(fromOptions.getKeepAlive()) - .truncate(fromOptions.getTruncate()) - .useNUMA(fromOptions.getUseNUMA()) - .numCtx(fromOptions.getNumCtx()) - .numBatch(fromOptions.getNumBatch()) - .numGPU(fromOptions.getNumGPU()) - .mainGPU(fromOptions.getMainGPU()) - .lowVRAM(fromOptions.getLowVRAM()) - .f16KV(fromOptions.getF16KV()) - .logitsAll(fromOptions.getLogitsAll()) - .vocabOnly(fromOptions.getVocabOnly()) - .useMMap(fromOptions.getUseMMap()) - .useMLock(fromOptions.getUseMLock()) - .numThread(fromOptions.getNumThread()) - .numKeep(fromOptions.getNumKeep()) - .seed(fromOptions.getSeed()) - .numPredict(fromOptions.getNumPredict()) - .topK(fromOptions.getTopK()) - .topP(fromOptions.getTopP()) - .minP(fromOptions.getMinP()) - .tfsZ(fromOptions.getTfsZ()) - .typicalP(fromOptions.getTypicalP()) - .repeatLastN(fromOptions.getRepeatLastN()) - .temperature(fromOptions.getTemperature()) - .repeatPenalty(fromOptions.getRepeatPenalty()) - .presencePenalty(fromOptions.getPresencePenalty()) - .frequencyPenalty(fromOptions.getFrequencyPenalty()) - .mirostat(fromOptions.getMirostat()) - .mirostatTau(fromOptions.getMirostatTau()) - .mirostatEta(fromOptions.getMirostatEta()) - .penalizeNewline(fromOptions.getPenalizeNewline()) - .stop(fromOptions.getStop()) - .toolNames(fromOptions.getToolNames()) - .internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled()) - .toolCallbacks(fromOptions.getToolCallbacks()) - .toolContext(fromOptions.getToolContext()).build(); - } - // ------------------- // Getters and Setters // ------------------- diff --git a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaEmbeddingOptions.java b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaEmbeddingOptions.java index 24bb0618f5b..07881aedfae 100644 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaEmbeddingOptions.java +++ b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaEmbeddingOptions.java @@ -184,23 +184,6 @@ public static OllamaEmbeddingOptions fromOptions(OllamaEmbeddingOptions fromOpti .build(); } - public static OllamaEmbeddingOptions fromOptions(OllamaOptions fromOptions) { - return builder() - .model(fromOptions.getModel()) - .keepAlive(fromOptions.getKeepAlive()) - .truncate(fromOptions.getTruncate()) - .useNUMA(fromOptions.getUseNUMA()) - .numBatch(fromOptions.getNumBatch()) - .numGPU(fromOptions.getNumGPU()) - .mainGPU(fromOptions.getMainGPU()) - .lowVRAM(fromOptions.getLowVRAM()) - .vocabOnly(fromOptions.getVocabOnly()) - .useMMap(fromOptions.getUseMMap()) - .useMLock(fromOptions.getUseMLock()) - .numThread(fromOptions.getNumThread()) - .build(); - } - // ------------------- // Getters and Setters // ------------------- diff --git a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaOptions.java b/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaOptions.java deleted file mode 100644 index 84c0752654b..00000000000 --- a/models/spring-ai-ollama/src/main/java/org/springframework/ai/ollama/api/OllamaOptions.java +++ /dev/null @@ -1,1216 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.ollama.api; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; - -import org.springframework.ai.embedding.EmbeddingOptions; -import org.springframework.ai.model.ModelOptionsUtils; -import org.springframework.ai.model.tool.ToolCallingChatOptions; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.lang.Nullable; -import org.springframework.util.Assert; - -/** - * Helper class for creating strongly-typed Ollama options. - * - * @author Christian Tzolov - * @author Thomas Vitale - * @author Ilayaperumal Gopinathan - * @since 0.8.0 - * @see Ollama - * Valid Parameters and Values - * @see Ollama Types - * @deprecated use OllamaChatOptions or OllamaEmbeddingOptions instead. - */ -@JsonInclude(Include.NON_NULL) -@Deprecated -public class OllamaOptions implements ToolCallingChatOptions, EmbeddingOptions { - - private static final List NON_SUPPORTED_FIELDS = List.of("model", "format", "keep_alive", "truncate"); - - // Following fields are options which must be set when the model is loaded into - // memory. - // See: https://github.com/ggerganov/llama.cpp/blob/master/examples/main/README.md - - // @formatter:off - - /** - * Whether to use NUMA. (Default: false) - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("numa") - @Deprecated - private Boolean useNUMA; - - /** - * Sets the size of the context window used to generate the next token. (Default: 2048) - */ - @JsonProperty("num_ctx") - private Integer numCtx; - - /** - * Prompt processing maximum batch size. (Default: 512) - */ - @JsonProperty("num_batch") - private Integer numBatch; - - /** - * The number of layers to send to the GPU(s). On macOS, it defaults to 1 - * to enable metal support, 0 to disable. - * (Default: -1, which indicates that numGPU should be set dynamically) - */ - @JsonProperty("num_gpu") - private Integer numGPU; - - /** - * When using multiple GPUs this option controls which GPU is used - * for small tensors for which the overhead of splitting the computation - * across all GPUs is not worthwhile. The GPU in question will use slightly - * more VRAM to store a scratch buffer for temporary results. - * By default, GPU 0 is used. - */ - @JsonProperty("main_gpu") - private Integer mainGPU; - - /** - * (Default: false) - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("low_vram") - @Deprecated - private Boolean lowVRAM; - - /** - * (Default: true) - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("f16_kv") - @Deprecated - private Boolean f16KV; - - /** - * Return logits for all the tokens, not just the last one. - * To enable completions to return logprobs, this must be true. - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("logits_all") - @Deprecated - private Boolean logitsAll; - - /** - * Load only the vocabulary, not the weights. - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("vocab_only") - @Deprecated - private Boolean vocabOnly; - - /** - * By default, models are mapped into memory, which allows the system to load only the necessary parts - * of the model as needed. However, if the model is larger than your total amount of RAM or if your system is low - * on available memory, using mmap might increase the risk of pageouts, negatively impacting performance. - * Disabling mmap results in slower load times but may reduce pageouts if you're not using mlock. - * Note that if the model is larger than the total amount of RAM, turning off mmap would prevent - * the model from loading at all. - * (Default: null) - */ - @JsonProperty("use_mmap") - private Boolean useMMap; - - /** - * Lock the model in memory, preventing it from being swapped out when memory-mapped. - * This can improve performance but trades away some of the advantages of memory-mapping - * by requiring more RAM to run and potentially slowing down load times as the model loads into RAM. - * (Default: false) - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("use_mlock") - @Deprecated - private Boolean useMLock; - - /** - * Set the number of threads to use during generation. For optimal performance, it is recommended to set this value - * to the number of physical CPU cores your system has (as opposed to the logical number of cores). - * Using the correct number of threads can greatly improve performance. - * By default, Ollama will detect this value for optimal performance. - */ - @JsonProperty("num_thread") - private Integer numThread; - - // Following fields are predict options used at runtime. - - /** - * (Default: 4) - */ - @JsonProperty("num_keep") - private Integer numKeep; - - /** - * Sets the random number seed to use for generation. Setting this to a - * specific number will make the model generate the same text for the same prompt. - * (Default: -1) - */ - @JsonProperty("seed") - private Integer seed; - - /** - * Maximum number of tokens to predict when generating text. - * (Default: 128, -1 = infinite generation, -2 = fill context) - */ - @JsonProperty("num_predict") - private Integer numPredict; - - /** - * Reduces the probability of generating nonsense. A higher value (e.g. - * 100) will give more diverse answers, while a lower value (e.g. 10) will be more - * conservative. (Default: 40) - */ - @JsonProperty("top_k") - private Integer topK; - - /** - * Works together with top-k. A higher value (e.g., 0.95) will lead to - * more diverse text, while a lower value (e.g., 0.5) will generate more focused and - * conservative text. (Default: 0.9) - */ - @JsonProperty("top_p") - private Double topP; - - /** - * Alternative to the top_p, and aims to ensure a balance of quality and variety. - * The parameter p represents the minimum probability for a token to be considered, - * relative to the probability of the most likely token. For example, with p=0.05 and - * the most likely token having a probability of 0.9, logits with a value - * less than 0.045 are filtered out. (Default: 0.0) - */ - @JsonProperty("min_p") - private Double minP; - - /** - * Tail free sampling is used to reduce the impact of less probable tokens - * from the output. A higher value (e.g., 2.0) will reduce the impact more, while a - * value of 1.0 disables this setting. (default: 1) - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("tfs_z") - @Deprecated - private Float tfsZ; - - /** - * (Default: 1.0) - */ - @JsonProperty("typical_p") - private Float typicalP; - - /** - * Sets how far back for the model to look back to prevent - * repetition. (Default: 64, 0 = disabled, -1 = num_ctx) - */ - @JsonProperty("repeat_last_n") - private Integer repeatLastN; - - /** - * The temperature of the model. Increasing the temperature will - * make the model answer more creatively. (Default: 0.8) - */ - @JsonProperty("temperature") - private Double temperature; - - /** - * Sets how strongly to penalize repetitions. A higher value - * (e.g., 1.5) will penalize repetitions more strongly, while a lower value (e.g., - * 0.9) will be more lenient. (Default: 1.1) - */ - @JsonProperty("repeat_penalty") - private Double repeatPenalty; - - /** - * (Default: 0.0) - */ - @JsonProperty("presence_penalty") - private Double presencePenalty; - - /** - * (Default: 0.0) - */ - @JsonProperty("frequency_penalty") - private Double frequencyPenalty; - - /** - * Enable Mirostat sampling for controlling perplexity. (default: 0, 0 - * = disabled, 1 = Mirostat, 2 = Mirostat 2.0) - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("mirostat") - @Deprecated - private Integer mirostat; - - /** - * Controls the balance between coherence and diversity of the output. - * A lower value will result in more focused and coherent text. (Default: 5.0) - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("mirostat_tau") - @Deprecated - private Float mirostatTau; - - /** - * Influences how quickly the algorithm responds to feedback from the generated text. - * A lower learning rate will result in slower adjustments, while a higher learning rate - * will make the algorithm more responsive. (Default: 0.1) - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("mirostat_eta") - @Deprecated - private Float mirostatEta; - - /** - * (Default: true) - * - * @deprecated Not supported in Ollama anymore. - */ - @JsonProperty("penalize_newline") - @Deprecated - private Boolean penalizeNewline; - - /** - * Sets the stop sequences to use. When this pattern is encountered the - * LLM will stop generating text and return. Multiple stop patterns may be set by - * specifying multiple separate stop parameters in a modelfile. - */ - @JsonProperty("stop") - private List stop; - - - // Following fields are not part of the Ollama Options API but part of the Request. - - /** - * NOTE: Synthetic field not part of the official Ollama API. - * Used to allow overriding the model name with prompt options. - * Part of Chat completion parameters. - */ - @JsonProperty("model") - private String model; - - /** - * Sets the desired format of output from the LLM. The only valid values are null or "json". - * Part of Chat completion advanced parameters. - */ - @JsonProperty("format") - private Object format; - - /** - * Sets the length of time for Ollama to keep the model loaded. Valid values for this - * setting are parsed by ParseDuration in Go. - * Part of Chat completion advanced parameters. - */ - @JsonProperty("keep_alive") - private String keepAlive; - - /** - * Truncates the end of each input to fit within context length. Returns error if false and context length is exceeded. - * Defaults to true. - */ - @JsonProperty("truncate") - private Boolean truncate; - - @JsonIgnore - private Boolean internalToolExecutionEnabled; - - /** - * Tool Function Callbacks to register with the ChatModel. - * For Prompt Options the toolCallbacks are automatically enabled for the duration of the prompt execution. - * For Default Options the toolCallbacks are registered but disabled by default. Use the enableFunctions to set the functions - * from the registry to be used by the ChatModel chat completion requests. - */ - @JsonIgnore - private List toolCallbacks = new ArrayList<>(); - - /** - * List of functions, identified by their names, to configure for function calling in - * the chat completion requests. - * Functions with those names must exist in the toolCallbacks registry. - * The {@link #toolCallbacks} from the PromptOptions are automatically enabled for the duration of the prompt execution. - * Note that function enabled with the default options are enabled for all chat completion requests. This could impact the token count and the billing. - * If the functions is set in a prompt options, then the enabled functions are only active for the duration of this prompt execution. - */ - @JsonIgnore - private Set toolNames = new HashSet<>(); - - @JsonIgnore - private Map toolContext = new HashMap<>(); - - public static Builder builder() { - return new Builder(); - } - - /** - * Filter out the non-supported fields from the options. - * @param options The options to filter. - * @return The filtered options. - */ - public static Map filterNonSupportedFields(Map options) { - return options.entrySet().stream() - .filter(e -> !NON_SUPPORTED_FIELDS.contains(e.getKey())) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - } - - public static OllamaOptions fromOptions(OllamaOptions fromOptions) { - return builder() - .model(fromOptions.getModel()) - .format(fromOptions.getFormat()) - .keepAlive(fromOptions.getKeepAlive()) - .truncate(fromOptions.getTruncate()) - .useNUMA(fromOptions.getUseNUMA()) - .numCtx(fromOptions.getNumCtx()) - .numBatch(fromOptions.getNumBatch()) - .numGPU(fromOptions.getNumGPU()) - .mainGPU(fromOptions.getMainGPU()) - .lowVRAM(fromOptions.getLowVRAM()) - .f16KV(fromOptions.getF16KV()) - .logitsAll(fromOptions.getLogitsAll()) - .vocabOnly(fromOptions.getVocabOnly()) - .useMMap(fromOptions.getUseMMap()) - .useMLock(fromOptions.getUseMLock()) - .numThread(fromOptions.getNumThread()) - .numKeep(fromOptions.getNumKeep()) - .seed(fromOptions.getSeed()) - .numPredict(fromOptions.getNumPredict()) - .topK(fromOptions.getTopK()) - .topP(fromOptions.getTopP()) - .minP(fromOptions.getMinP()) - .tfsZ(fromOptions.getTfsZ()) - .typicalP(fromOptions.getTypicalP()) - .repeatLastN(fromOptions.getRepeatLastN()) - .temperature(fromOptions.getTemperature()) - .repeatPenalty(fromOptions.getRepeatPenalty()) - .presencePenalty(fromOptions.getPresencePenalty()) - .frequencyPenalty(fromOptions.getFrequencyPenalty()) - .mirostat(fromOptions.getMirostat()) - .mirostatTau(fromOptions.getMirostatTau()) - .mirostatEta(fromOptions.getMirostatEta()) - .penalizeNewline(fromOptions.getPenalizeNewline()) - .stop(fromOptions.getStop()) - .toolNames(fromOptions.getToolNames()) - .internalToolExecutionEnabled(fromOptions.getInternalToolExecutionEnabled()) - .toolCallbacks(fromOptions.getToolCallbacks()) - .toolContext(fromOptions.getToolContext()).build(); - } - - // ------------------- - // Getters and Setters - // ------------------- - @Override - public String getModel() { - return this.model; - } - - public void setModel(String model) { - this.model = model; - } - - public Object getFormat() { - return this.format; - } - - public void setFormat(Object format) { - this.format = format; - } - - public String getKeepAlive() { - return this.keepAlive; - } - - public void setKeepAlive(String keepAlive) { - this.keepAlive = keepAlive; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Boolean getUseNUMA() { - return this.useNUMA; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setUseNUMA(Boolean useNUMA) { - this.useNUMA = useNUMA; - } - - public Integer getNumCtx() { - return this.numCtx; - } - - public void setNumCtx(Integer numCtx) { - this.numCtx = numCtx; - } - - public Integer getNumBatch() { - return this.numBatch; - } - - public void setNumBatch(Integer numBatch) { - this.numBatch = numBatch; - } - - public Integer getNumGPU() { - return this.numGPU; - } - - public void setNumGPU(Integer numGPU) { - this.numGPU = numGPU; - } - - public Integer getMainGPU() { - return this.mainGPU; - } - - public void setMainGPU(Integer mainGPU) { - this.mainGPU = mainGPU; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Boolean getLowVRAM() { - return this.lowVRAM; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setLowVRAM(Boolean lowVRAM) { - this.lowVRAM = lowVRAM; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Boolean getF16KV() { - return this.f16KV; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setF16KV(Boolean f16kv) { - this.f16KV = f16kv; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Boolean getLogitsAll() { - return this.logitsAll; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setLogitsAll(Boolean logitsAll) { - this.logitsAll = logitsAll; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Boolean getVocabOnly() { - return this.vocabOnly; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setVocabOnly(Boolean vocabOnly) { - this.vocabOnly = vocabOnly; - } - - public Boolean getUseMMap() { - return this.useMMap; - } - - public void setUseMMap(Boolean useMMap) { - this.useMMap = useMMap; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Boolean getUseMLock() { - return this.useMLock; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setUseMLock(Boolean useMLock) { - this.useMLock = useMLock; - } - - public Integer getNumThread() { - return this.numThread; - } - - public void setNumThread(Integer numThread) { - this.numThread = numThread; - } - - public Integer getNumKeep() { - return this.numKeep; - } - - public void setNumKeep(Integer numKeep) { - this.numKeep = numKeep; - } - - public Integer getSeed() { - return this.seed; - } - - public void setSeed(Integer seed) { - this.seed = seed; - } - - @Override - @JsonIgnore - public Integer getMaxTokens() { - return getNumPredict(); - } - - @JsonIgnore - public void setMaxTokens(Integer maxTokens) { - setNumPredict(maxTokens); - } - - public Integer getNumPredict() { - return this.numPredict; - } - - public void setNumPredict(Integer numPredict) { - this.numPredict = numPredict; - } - - @Override - public Integer getTopK() { - return this.topK; - } - - public void setTopK(Integer topK) { - this.topK = topK; - } - - @Override - public Double getTopP() { - return this.topP; - } - - public void setTopP(Double topP) { - this.topP = topP; - } - - public Double getMinP() { - return this.minP; - } - - public void setMinP(Double minP) { - this.minP = minP; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Float getTfsZ() { - return this.tfsZ; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setTfsZ(Float tfsZ) { - this.tfsZ = tfsZ; - } - - public Float getTypicalP() { - return this.typicalP; - } - - public void setTypicalP(Float typicalP) { - this.typicalP = typicalP; - } - - public Integer getRepeatLastN() { - return this.repeatLastN; - } - - public void setRepeatLastN(Integer repeatLastN) { - this.repeatLastN = repeatLastN; - } - - @Override - public Double getTemperature() { - return this.temperature; - } - - public void setTemperature(Double temperature) { - this.temperature = temperature; - } - - public Double getRepeatPenalty() { - return this.repeatPenalty; - } - - public void setRepeatPenalty(Double repeatPenalty) { - this.repeatPenalty = repeatPenalty; - } - - @Override - public Double getPresencePenalty() { - return this.presencePenalty; - } - - public void setPresencePenalty(Double presencePenalty) { - this.presencePenalty = presencePenalty; - } - - @Override - public Double getFrequencyPenalty() { - return this.frequencyPenalty; - } - - public void setFrequencyPenalty(Double frequencyPenalty) { - this.frequencyPenalty = frequencyPenalty; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Integer getMirostat() { - return this.mirostat; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setMirostat(Integer mirostat) { - this.mirostat = mirostat; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Float getMirostatTau() { - return this.mirostatTau; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setMirostatTau(Float mirostatTau) { - this.mirostatTau = mirostatTau; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Float getMirostatEta() { - return this.mirostatEta; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setMirostatEta(Float mirostatEta) { - this.mirostatEta = mirostatEta; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Boolean getPenalizeNewline() { - return this.penalizeNewline; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public void setPenalizeNewline(Boolean penalizeNewline) { - this.penalizeNewline = penalizeNewline; - } - - @Override - @JsonIgnore - public List getStopSequences() { - return getStop(); - } - - @JsonIgnore - public void setStopSequences(List stopSequences) { - setStop(stopSequences); - } - - public List getStop() { - return this.stop; - } - - public void setStop(List stop) { - this.stop = stop; - } - - public Boolean getTruncate() { - return this.truncate; - } - - public void setTruncate(Boolean truncate) { - this.truncate = truncate; - } - - @Override - @JsonIgnore - public List getToolCallbacks() { - return this.toolCallbacks; - } - - @Override - @JsonIgnore - public void setToolCallbacks(List toolCallbacks) { - Assert.notNull(toolCallbacks, "toolCallbacks cannot be null"); - Assert.noNullElements(toolCallbacks, "toolCallbacks cannot contain null elements"); - this.toolCallbacks = toolCallbacks; - } - - @Override - @JsonIgnore - public Set getToolNames() { - return this.toolNames; - } - - @Override - @JsonIgnore - public void setToolNames(Set toolNames) { - Assert.notNull(toolNames, "toolNames cannot be null"); - Assert.noNullElements(toolNames, "toolNames cannot contain null elements"); - toolNames.forEach(tool -> Assert.hasText(tool, "toolNames cannot contain empty elements")); - this.toolNames = toolNames; - } - - @Override - @Nullable - @JsonIgnore - public Boolean getInternalToolExecutionEnabled() { - return this.internalToolExecutionEnabled; - } - - @Override - @JsonIgnore - public void setInternalToolExecutionEnabled(@Nullable Boolean internalToolExecutionEnabled) { - this.internalToolExecutionEnabled = internalToolExecutionEnabled; - } - - @Override - @JsonIgnore - public Integer getDimensions() { - return null; - } - - @Override - @JsonIgnore - public Map getToolContext() { - return this.toolContext; - } - - @Override - @JsonIgnore - public void setToolContext(Map toolContext) { - this.toolContext = toolContext; - } - - /** - * Convert the {@link OllamaOptions} object to a {@link Map} of key/value pairs. - * @return The {@link Map} of key/value pairs. - */ - public Map toMap() { - return ModelOptionsUtils.objectToMap(this); - } - - @Override - public OllamaOptions copy() { - return fromOptions(this); - } - // @formatter:on - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - OllamaOptions that = (OllamaOptions) o; - return Objects.equals(this.model, that.model) && Objects.equals(this.format, that.format) - && Objects.equals(this.keepAlive, that.keepAlive) && Objects.equals(this.truncate, that.truncate) - && Objects.equals(this.useNUMA, that.useNUMA) && Objects.equals(this.numCtx, that.numCtx) - && Objects.equals(this.numBatch, that.numBatch) && Objects.equals(this.numGPU, that.numGPU) - && Objects.equals(this.mainGPU, that.mainGPU) && Objects.equals(this.lowVRAM, that.lowVRAM) - && Objects.equals(this.f16KV, that.f16KV) && Objects.equals(this.logitsAll, that.logitsAll) - && Objects.equals(this.vocabOnly, that.vocabOnly) && Objects.equals(this.useMMap, that.useMMap) - && Objects.equals(this.useMLock, that.useMLock) && Objects.equals(this.numThread, that.numThread) - && Objects.equals(this.numKeep, that.numKeep) && Objects.equals(this.seed, that.seed) - && Objects.equals(this.numPredict, that.numPredict) && Objects.equals(this.topK, that.topK) - && Objects.equals(this.topP, that.topP) && Objects.equals(this.minP, that.minP) - && Objects.equals(this.tfsZ, that.tfsZ) && Objects.equals(this.typicalP, that.typicalP) - && Objects.equals(this.repeatLastN, that.repeatLastN) - && Objects.equals(this.temperature, that.temperature) - && Objects.equals(this.repeatPenalty, that.repeatPenalty) - && Objects.equals(this.presencePenalty, that.presencePenalty) - && Objects.equals(this.frequencyPenalty, that.frequencyPenalty) - && Objects.equals(this.mirostat, that.mirostat) && Objects.equals(this.mirostatTau, that.mirostatTau) - && Objects.equals(this.mirostatEta, that.mirostatEta) - && Objects.equals(this.penalizeNewline, that.penalizeNewline) && Objects.equals(this.stop, that.stop) - && Objects.equals(this.toolCallbacks, that.toolCallbacks) - && Objects.equals(this.internalToolExecutionEnabled, that.internalToolExecutionEnabled) - && Objects.equals(this.toolNames, that.toolNames) && Objects.equals(this.toolContext, that.toolContext); - } - - @Override - public int hashCode() { - return Objects.hash(this.model, this.format, this.keepAlive, this.truncate, this.useNUMA, this.numCtx, - this.numBatch, this.numGPU, this.mainGPU, this.lowVRAM, this.f16KV, this.logitsAll, this.vocabOnly, - this.useMMap, this.useMLock, this.numThread, this.numKeep, this.seed, this.numPredict, this.topK, - this.topP, this.minP, this.tfsZ, this.typicalP, this.repeatLastN, this.temperature, this.repeatPenalty, - this.presencePenalty, this.frequencyPenalty, this.mirostat, this.mirostatTau, this.mirostatEta, - this.penalizeNewline, this.stop, this.toolCallbacks, this.toolNames, this.internalToolExecutionEnabled, - this.toolContext); - } - - @Deprecated - public static final class Builder { - - private final OllamaOptions options = new OllamaOptions(); - - public Builder model(String model) { - this.options.model = model; - return this; - } - - public Builder model(OllamaModel model) { - this.options.model = model.getName(); - return this; - } - - public Builder format(Object format) { - this.options.format = format; - return this; - } - - public Builder keepAlive(String keepAlive) { - this.options.keepAlive = keepAlive; - return this; - } - - public Builder truncate(Boolean truncate) { - this.options.truncate = truncate; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder useNUMA(Boolean useNUMA) { - this.options.useNUMA = useNUMA; - return this; - } - - public Builder numCtx(Integer numCtx) { - this.options.numCtx = numCtx; - return this; - } - - public Builder numBatch(Integer numBatch) { - this.options.numBatch = numBatch; - return this; - } - - public Builder numGPU(Integer numGPU) { - this.options.numGPU = numGPU; - return this; - } - - public Builder mainGPU(Integer mainGPU) { - this.options.mainGPU = mainGPU; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder lowVRAM(Boolean lowVRAM) { - this.options.lowVRAM = lowVRAM; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder f16KV(Boolean f16KV) { - this.options.f16KV = f16KV; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder logitsAll(Boolean logitsAll) { - this.options.logitsAll = logitsAll; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder vocabOnly(Boolean vocabOnly) { - this.options.vocabOnly = vocabOnly; - return this; - } - - public Builder useMMap(Boolean useMMap) { - this.options.useMMap = useMMap; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder useMLock(Boolean useMLock) { - this.options.useMLock = useMLock; - return this; - } - - public Builder numThread(Integer numThread) { - this.options.numThread = numThread; - return this; - } - - public Builder numKeep(Integer numKeep) { - this.options.numKeep = numKeep; - return this; - } - - public Builder seed(Integer seed) { - this.options.seed = seed; - return this; - } - - public Builder numPredict(Integer numPredict) { - this.options.numPredict = numPredict; - return this; - } - - public Builder topK(Integer topK) { - this.options.topK = topK; - return this; - } - - public Builder topP(Double topP) { - this.options.topP = topP; - return this; - } - - public Builder minP(Double minP) { - this.options.minP = minP; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder tfsZ(Float tfsZ) { - this.options.tfsZ = tfsZ; - return this; - } - - public Builder typicalP(Float typicalP) { - this.options.typicalP = typicalP; - return this; - } - - public Builder repeatLastN(Integer repeatLastN) { - this.options.repeatLastN = repeatLastN; - return this; - } - - public Builder temperature(Double temperature) { - this.options.temperature = temperature; - return this; - } - - public Builder repeatPenalty(Double repeatPenalty) { - this.options.repeatPenalty = repeatPenalty; - return this; - } - - public Builder presencePenalty(Double presencePenalty) { - this.options.presencePenalty = presencePenalty; - return this; - } - - public Builder frequencyPenalty(Double frequencyPenalty) { - this.options.frequencyPenalty = frequencyPenalty; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder mirostat(Integer mirostat) { - this.options.mirostat = mirostat; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder mirostatTau(Float mirostatTau) { - this.options.mirostatTau = mirostatTau; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder mirostatEta(Float mirostatEta) { - this.options.mirostatEta = mirostatEta; - return this; - } - - /** - * @deprecated Not supported in Ollama anymore. - */ - @Deprecated - public Builder penalizeNewline(Boolean penalizeNewline) { - this.options.penalizeNewline = penalizeNewline; - return this; - } - - public Builder stop(List stop) { - this.options.stop = stop; - return this; - } - - public Builder toolCallbacks(List toolCallbacks) { - this.options.setToolCallbacks(toolCallbacks); - return this; - } - - public Builder toolCallbacks(ToolCallback... toolCallbacks) { - Assert.notNull(toolCallbacks, "toolCallbacks cannot be null"); - this.options.toolCallbacks.addAll(Arrays.asList(toolCallbacks)); - return this; - } - - public Builder toolNames(Set toolNames) { - this.options.setToolNames(toolNames); - return this; - } - - public Builder toolNames(String... toolNames) { - Assert.notNull(toolNames, "toolNames cannot be null"); - this.options.toolNames.addAll(Set.of(toolNames)); - return this; - } - - public Builder internalToolExecutionEnabled(@Nullable Boolean internalToolExecutionEnabled) { - this.options.setInternalToolExecutionEnabled(internalToolExecutionEnabled); - return this; - } - - public Builder toolContext(Map toolContext) { - if (this.options.toolContext == null) { - this.options.toolContext = toolContext; - } - else { - this.options.toolContext.putAll(toolContext); - } - return this; - } - - public OllamaOptions build() { - return this.options; - } - - } - -} diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelTests.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelTests.java index 688235309ff..936d2f091b7 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelTests.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatModelTests.java @@ -58,16 +58,6 @@ class OllamaChatModelTests { @Mock OllamaApi ollamaApi; - @Test - void buildOllamaChatModelWithDeprecatedConstructor() { - ChatModel chatModel = OllamaChatModel.builder() - .ollamaApi(this.ollamaApi) - .defaultOptions(OllamaChatOptions.builder().model(OllamaModel.MISTRAL).build()) - .observationRegistry(ObservationRegistry.NOOP) - .build(); - assertThat(chatModel).isNotNull(); - } - @Test void buildOllamaChatModelWithConstructor() { ChatModel chatModel = new OllamaChatModel(this.ollamaApi, diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatRequestTests.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatRequestTests.java index a0dc2b514fc..14d658ce403 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatRequestTests.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaChatRequestTests.java @@ -32,7 +32,6 @@ import org.springframework.ai.model.tool.ToolCallingChatOptions; import org.springframework.ai.ollama.api.OllamaApi; import org.springframework.ai.ollama.api.OllamaChatOptions; -import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.DefaultToolDefinition; @@ -106,7 +105,7 @@ void createRequestWithDefaultOptions() { @Test void createRequestWithPromptOllamaOptions() { // Runtime options should override the default options. - OllamaOptions promptOptions = OllamaOptions.builder().temperature(0.8).topP(0.5).numGPU(2).build(); + OllamaChatOptions promptOptions = OllamaChatOptions.builder().temperature(0.8).topP(0.5).numGPU(2).build(); var prompt = this.chatModel.buildRequestPrompt(new Prompt("Test message content", promptOptions)); var request = this.chatModel.ollamaChatRequest(prompt, true); @@ -189,7 +188,7 @@ public void createRequestWithDefaultOptionsModelOverride() { assertThat(request.model()).isEqualTo("DEFAULT_OPTIONS_MODEL"); // Prompt options should override the default options. - OllamaOptions promptOptions = OllamaOptions.builder().model("PROMPT_MODEL").build(); + OllamaChatOptions promptOptions = OllamaChatOptions.builder().model("PROMPT_MODEL").build(); var prompt2 = chatModel.buildRequestPrompt(new Prompt("Test message content", promptOptions)); request = chatModel.ollamaChatRequest(prompt2, true); diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaEmbeddingModelTests.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaEmbeddingModelTests.java index 5f15eef2166..ac43311bd9d 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaEmbeddingModelTests.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaEmbeddingModelTests.java @@ -26,7 +26,7 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.embedding.EmbeddingRequest; import org.springframework.ai.embedding.EmbeddingResponse; import org.springframework.ai.embedding.EmbeddingResultMetadata; @@ -70,8 +70,8 @@ void options() { .defaultOptions(defaultOptions) .build(); - EmbeddingResponse response = embeddingModel.call( - new EmbeddingRequest(List.of("Input1", "Input2", "Input3"), EmbeddingOptionsBuilder.builder().build())); + EmbeddingResponse response = embeddingModel + .call(new EmbeddingRequest(List.of("Input1", "Input2", "Input3"), EmbeddingOptions.builder().build())); assertThat(response.getResults()).hasSize(2); assertThat(response.getResults().get(0).getIndex()).isEqualTo(0); @@ -118,7 +118,7 @@ void singleInputEmbedding() { .build(); EmbeddingResponse response = embeddingModel - .call(new EmbeddingRequest(List.of("Single input text"), EmbeddingOptionsBuilder.builder().build())); + .call(new EmbeddingRequest(List.of("Single input text"), EmbeddingOptions.builder().build())); assertThat(response.getResults()).hasSize(1); assertThat(response.getResults().get(0).getIndex()).isEqualTo(0); @@ -167,7 +167,7 @@ void embeddingWithMultipleLargeInputs() { .build(); EmbeddingResponse response = embeddingModel - .call(new EmbeddingRequest(largeInputs, EmbeddingOptionsBuilder.builder().build())); + .call(new EmbeddingRequest(largeInputs, EmbeddingOptions.builder().build())); assertThat(response.getResults()).hasSize(3); assertThat(response.getResults().get(0).getOutput()).hasSize(4); @@ -211,7 +211,7 @@ void embeddingResponseMetadata() { .build(); EmbeddingResponse response = embeddingModel - .call(new EmbeddingRequest(List.of("Metadata test"), EmbeddingOptionsBuilder.builder().build())); + .call(new EmbeddingRequest(List.of("Metadata test"), EmbeddingOptions.builder().build())); assertThat(response.getMetadata().getModel()).isEqualTo("METADATA_MODEL"); assertThat(response.getResults()).hasSize(1); @@ -229,7 +229,7 @@ void embeddingWithZeroLengthVectors() { .build(); EmbeddingResponse response = embeddingModel - .call(new EmbeddingRequest(List.of("Zero length test"), EmbeddingOptionsBuilder.builder().build())); + .call(new EmbeddingRequest(List.of("Zero length test"), EmbeddingOptions.builder().build())); assertThat(response.getResults()).hasSize(1); assertThat(response.getResults().get(0).getOutput()).isEmpty(); diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaRetryTests.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaRetryTests.java index 323c969c6fa..d098c17fb07 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaRetryTests.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/OllamaRetryTests.java @@ -31,7 +31,6 @@ import org.springframework.ai.ollama.api.OllamaApi; import org.springframework.ai.ollama.api.OllamaChatOptions; import org.springframework.ai.ollama.api.OllamaModel; -import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.ai.retry.NonTransientAiException; import org.springframework.ai.retry.RetryUtils; import org.springframework.ai.retry.TransientAiException; @@ -160,7 +159,7 @@ void ollamaChatWithMultipleMessages() { @Test void ollamaChatWithCustomOptions() { String promptText = "Custom temperature request"; - OllamaOptions customOptions = OllamaOptions.builder().model(MODEL).temperature(0.1).topP(0.9).build(); + OllamaChatOptions customOptions = OllamaChatOptions.builder().model(MODEL).temperature(0.1).topP(0.9).build(); var expectedChatResponse = new OllamaApi.ChatResponse("CHAT_COMPLETION_ID", Instant.now(), OllamaApi.Message.builder(OllamaApi.Message.Role.ASSISTANT).content("Deterministic response").build(), diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/OllamaApiIT.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/OllamaApiIT.java index b31ba5365f8..e004b8f9a28 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/OllamaApiIT.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/OllamaApiIT.java @@ -130,7 +130,7 @@ public void think() { .content("What is the capital of Bulgaria and what is the size? " + "What it the national anthem?") .build())) - .options(OllamaOptions.builder().temperature(0.9).build()) + .options(OllamaChatOptions.builder().temperature(0.9).build()) .think(true) .build(); diff --git a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/OllamaModelOptionsTests.java b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/OllamaModelOptionsTests.java index e50ace4a094..82457aeb8ee 100644 --- a/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/OllamaModelOptionsTests.java +++ b/models/spring-ai-ollama/src/test/java/org/springframework/ai/ollama/api/OllamaModelOptionsTests.java @@ -210,7 +210,7 @@ public void testDeprecatedMethods() { @Test public void testEmptyOptions() { - var options = OllamaOptions.builder().build(); + var options = OllamaChatOptions.builder().build(); var optionsMap = options.toMap(); assertThat(optionsMap).isEmpty(); @@ -225,7 +225,7 @@ public void testEmptyOptions() { @Test public void testNullValuesNotIncludedInMap() { - var options = OllamaOptions.builder().model("llama2").temperature(null).topK(null).stop(null).build(); + var options = OllamaChatOptions.builder().model("llama2").temperature(null).topK(null).stop(null).build(); var optionsMap = options.toMap(); assertThat(optionsMap).containsEntry("model", "llama2"); @@ -236,7 +236,7 @@ public void testNullValuesNotIncludedInMap() { @Test public void testZeroValuesIncludedInMap() { - var options = OllamaOptions.builder().temperature(0.0).topK(0).mainGPU(0).numGPU(0).seed(0).build(); + var options = OllamaChatOptions.builder().temperature(0.0).topK(0).mainGPU(0).numGPU(0).seed(0).build(); var optionsMap = options.toMap(); assertThat(optionsMap).containsEntry("temperature", 0.0); diff --git a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java index cd89852d244..6f55ea28c3b 100644 --- a/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java +++ b/models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java @@ -267,10 +267,7 @@ public String getValue() { * recognition as well as speech translation and language identification. The Whisper * v2-large model is currently available through our API with the whisper-1 model * name. - * - * @deprecated See {@link TranscriptionModels#WHISPER_1} */ - @Deprecated public enum WhisperModel { // @formatter:off diff --git a/models/spring-ai-postgresml/src/test/java/org/springframework/ai/postgresml/PostgresMlEmbeddingModelIT.java b/models/spring-ai-postgresml/src/test/java/org/springframework/ai/postgresml/PostgresMlEmbeddingModelIT.java index f682823d41a..98a7f63b0ca 100644 --- a/models/spring-ai-postgresml/src/test/java/org/springframework/ai/postgresml/PostgresMlEmbeddingModelIT.java +++ b/models/spring-ai-postgresml/src/test/java/org/springframework/ai/postgresml/PostgresMlEmbeddingModelIT.java @@ -33,7 +33,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.MetadataMode; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.embedding.EmbeddingRequest; import org.springframework.ai.embedding.EmbeddingResponse; import org.springframework.ai.embedding.EmbeddingResponseMetadata; @@ -180,7 +180,7 @@ void embedCallWithRequestOptionsOverride() { embeddingModel.afterPropertiesSet(); var request1 = new EmbeddingRequest(List.of("Hello World!", "Spring AI!", "LLM!"), - EmbeddingOptionsBuilder.builder().build()); + EmbeddingOptions.builder().build()); EmbeddingResponse embeddingResponse = embeddingModel.call(request1); diff --git a/models/spring-ai-postgresml/src/test/java/org/springframework/ai/postgresml/PostgresMlEmbeddingOptionsTests.java b/models/spring-ai-postgresml/src/test/java/org/springframework/ai/postgresml/PostgresMlEmbeddingOptionsTests.java index 3a636493913..a89be788c53 100644 --- a/models/spring-ai-postgresml/src/test/java/org/springframework/ai/postgresml/PostgresMlEmbeddingOptionsTests.java +++ b/models/spring-ai-postgresml/src/test/java/org/springframework/ai/postgresml/PostgresMlEmbeddingOptionsTests.java @@ -21,7 +21,7 @@ import org.junit.jupiter.api.Test; import org.mockito.Mockito; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.jdbc.core.JdbcTemplate; import static org.assertj.core.api.Assertions.assertThat; @@ -62,7 +62,7 @@ public void mergeOptions() { var jdbcTemplate = Mockito.mock(JdbcTemplate.class); PostgresMlEmbeddingModel embeddingModel = new PostgresMlEmbeddingModel(jdbcTemplate); - PostgresMlEmbeddingOptions options = embeddingModel.mergeOptions(EmbeddingOptionsBuilder.builder().build()); + PostgresMlEmbeddingOptions options = embeddingModel.mergeOptions(EmbeddingOptions.builder().build()); // Default options assertThat(options.getTransformer()).isEqualTo(PostgresMlEmbeddingModel.DEFAULT_TRANSFORMER_MODEL); diff --git a/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java b/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java index 5d031ab8946..46314b93b47 100644 --- a/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java +++ b/models/spring-ai-transformers/src/main/java/org/springframework/ai/transformers/TransformersEmbeddingModel.java @@ -44,7 +44,7 @@ import org.springframework.ai.document.MetadataMode; import org.springframework.ai.embedding.AbstractEmbeddingModel; import org.springframework.ai.embedding.Embedding; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.embedding.EmbeddingRequest; import org.springframework.ai.embedding.EmbeddingResponse; import org.springframework.ai.embedding.observation.DefaultEmbeddingModelObservationConvention; @@ -276,7 +276,7 @@ public EmbeddingResponse embedForResponse(List texts) { @Override public List embed(List texts) { - return this.call(new EmbeddingRequest(texts, EmbeddingOptionsBuilder.builder().build())) + return this.call(new EmbeddingRequest(texts, EmbeddingOptions.builder().build())) .getResults() .stream() .map(e -> e.getOutput()) diff --git a/models/spring-ai-transformers/src/test/java/org/springframework/ai/transformers/TransformersEmbeddingModelObservationTests.java b/models/spring-ai-transformers/src/test/java/org/springframework/ai/transformers/TransformersEmbeddingModelObservationTests.java index d40f3883a25..db0fcc561f6 100644 --- a/models/spring-ai-transformers/src/test/java/org/springframework/ai/transformers/TransformersEmbeddingModelObservationTests.java +++ b/models/spring-ai-transformers/src/test/java/org/springframework/ai/transformers/TransformersEmbeddingModelObservationTests.java @@ -23,7 +23,7 @@ import org.junit.jupiter.api.Test; import org.springframework.ai.document.MetadataMode; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.embedding.EmbeddingRequest; import org.springframework.ai.embedding.EmbeddingResponse; import org.springframework.ai.embedding.EmbeddingResponseMetadata; @@ -55,7 +55,7 @@ public class TransformersEmbeddingModelObservationTests { @Test void observationForEmbeddingOperation() { - var options = EmbeddingOptionsBuilder.builder().model("bert-base-uncased").build(); + var options = EmbeddingOptions.builder().model("bert-base-uncased").build(); EmbeddingRequest embeddingRequest = new EmbeddingRequest(List.of("Here comes the sun"), options); diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiAssistantMessage.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiAssistantMessage.java index fa7511f64f8..8eb582e0b1a 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiAssistantMessage.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/ZhiPuAiAssistantMessage.java @@ -34,19 +34,7 @@ public class ZhiPuAiAssistantMessage extends AssistantMessage { */ private String reasoningContent; - /** - * @deprecated in favor of using {@link ZhiPuAiAssistantMessage.Builder} - */ - @Deprecated - public ZhiPuAiAssistantMessage(String content) { - super(content); - } - - /** - * @deprecated in favor of using {@link ZhiPuAiAssistantMessage.Builder} - */ - @Deprecated - public ZhiPuAiAssistantMessage(String content, String reasoningContent, Map properties, + protected ZhiPuAiAssistantMessage(String content, String reasoningContent, Map properties, List toolCalls, List media) { super(content, properties, toolCalls, media); this.reasoningContent = reasoningContent; diff --git a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/api/ZhiPuAiApi.java b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/api/ZhiPuAiApi.java index f07d93a159c..9ed4639f5ee 100644 --- a/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/api/ZhiPuAiApi.java +++ b/models/spring-ai-zhipuai/src/main/java/org/springframework/ai/zhipuai/api/ZhiPuAiApi.java @@ -99,54 +99,6 @@ public static Builder builder() { private final ZhiPuAiStreamFunctionCallingHelper chunkMerger = new ZhiPuAiStreamFunctionCallingHelper(); - /** - * Create a new chat completion api with default base URL. - * @param zhiPuAiToken ZhiPuAI apiKey. - * @deprecated Use {@link #builder()} instead. - */ - @Deprecated - public ZhiPuAiApi(String zhiPuAiToken) { - this(ZhiPuApiConstants.DEFAULT_BASE_URL, zhiPuAiToken); - } - - /** - * Create a new chat completion api. - * @param baseUrl api base URL. - * @param zhiPuAiToken ZhiPuAI apiKey. - * @deprecated Use {@link #builder()} instead. - */ - @Deprecated - public ZhiPuAiApi(String baseUrl, String zhiPuAiToken) { - this(baseUrl, zhiPuAiToken, RestClient.builder()); - } - - /** - * Create a new chat completion api. - * @param baseUrl api base URL. - * @param zhiPuAiToken ZhiPuAI apiKey. - * @param restClientBuilder RestClient builder. - * @deprecated Use {@link #builder()} instead. - */ - @Deprecated - public ZhiPuAiApi(String baseUrl, String zhiPuAiToken, RestClient.Builder restClientBuilder) { - this(baseUrl, zhiPuAiToken, restClientBuilder, RetryUtils.DEFAULT_RESPONSE_ERROR_HANDLER); - } - - /** - * Create a new chat completion api. - * @param baseUrl api base URL. - * @param zhiPuAiToken ZhiPuAI apiKey. - * @param restClientBuilder RestClient builder. - * @param responseErrorHandler Response error handler. - * @deprecated Use {@link #builder()} instead. - */ - @Deprecated - public ZhiPuAiApi(String baseUrl, String zhiPuAiToken, RestClient.Builder restClientBuilder, - ResponseErrorHandler responseErrorHandler) { - this(baseUrl, new SimpleApiKey(zhiPuAiToken), new LinkedMultiValueMap<>(), DEFAULT_COMPLETIONS_PATH, - DEFAULT_EMBEDDINGS_PATH, restClientBuilder, WebClient.builder(), responseErrorHandler); - } - /** * Create a new chat completion api. * @param baseUrl api base URL. @@ -158,7 +110,7 @@ public ZhiPuAiApi(String baseUrl, String zhiPuAiToken, RestClient.Builder restCl * @param webClientBuilder WebClient builder. * @param responseErrorHandler Response error handler. */ - private ZhiPuAiApi(String baseUrl, ApiKey apiKey, MultiValueMap headers, String completionsPath, + protected ZhiPuAiApi(String baseUrl, ApiKey apiKey, MultiValueMap headers, String completionsPath, String embeddingsPath, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, ResponseErrorHandler responseErrorHandler) { Assert.hasText(completionsPath, "Completions Path must not be null"); diff --git a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/ZhiPuAiAssistantMessageTests.java b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/ZhiPuAiAssistantMessageTests.java index b0c2bbfe60a..170f56579ef 100644 --- a/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/ZhiPuAiAssistantMessageTests.java +++ b/models/spring-ai-zhipuai/src/test/java/org/springframework/ai/zhipuai/ZhiPuAiAssistantMessageTests.java @@ -38,7 +38,7 @@ class ZhiPuAiAssistantMessageTests { @Test public void testConstructorWithContentOnly() { String content = "Hello, world!"; - ZhiPuAiAssistantMessage message = new ZhiPuAiAssistantMessage(content); + ZhiPuAiAssistantMessage message = new ZhiPuAiAssistantMessage.Builder().content(content).build(); assertThat(message.getText()).isEqualTo(content); assertThat(message.getReasoningContent()).isNull(); @@ -53,8 +53,12 @@ public void testConstructorWithAllParameters() { List toolCalls = List.of(new ToolCall("1", "function", "myFunction", "{}")); List media = List.of(); - ZhiPuAiAssistantMessage message = new ZhiPuAiAssistantMessage(content, reasoningContent, properties, toolCalls, - media); + ZhiPuAiAssistantMessage message = new ZhiPuAiAssistantMessage.Builder().content(content) + .reasoningContent(reasoningContent) + .properties(properties) + .toolCalls(toolCalls) + .media(media) + .build(); assertThat(message.getText()).isEqualTo(content); assertThat(message.getReasoningContent()).isEqualTo(reasoningContent); @@ -64,7 +68,7 @@ public void testConstructorWithAllParameters() { @Test public void testSettersAndGetters() { - ZhiPuAiAssistantMessage message = new ZhiPuAiAssistantMessage("test"); + ZhiPuAiAssistantMessage message = new ZhiPuAiAssistantMessage.Builder().content("test").build(); String reasoningContent = "New reasoning content"; diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClient.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClient.java index 3fcdeb9b9c1..4dab93683a3 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClient.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/ChatClient.java @@ -63,17 +63,7 @@ static ChatClient create(ChatModel chatModel) { } static ChatClient create(ChatModel chatModel, ObservationRegistry observationRegistry) { - return create(chatModel, observationRegistry, null); - } - - /** - * @deprecated in favor of - * {@link #create(ChatModel, ObservationRegistry, ChatClientObservationConvention, AdvisorObservationConvention)}. - */ - @Deprecated(since = "1.1.0", forRemoval = true) - static ChatClient create(ChatModel chatModel, ObservationRegistry observationRegistry, - @Nullable ChatClientObservationConvention chatClientObservationConvention) { - return create(chatModel, observationRegistry, chatClientObservationConvention, null); + return create(chatModel, observationRegistry, null, null); } static ChatClient create(ChatModel chatModel, ObservationRegistry observationRegistry, @@ -86,17 +76,7 @@ static ChatClient create(ChatModel chatModel, ObservationRegistry observationReg } static Builder builder(ChatModel chatModel) { - return builder(chatModel, ObservationRegistry.NOOP, null); - } - - /** - * @deprecated in favor of - * {@link #builder(ChatModel, ObservationRegistry, ChatClientObservationConvention, AdvisorObservationConvention)}. - */ - @Deprecated(since = "1.1.0", forRemoval = true) - static Builder builder(ChatModel chatModel, ObservationRegistry observationRegistry, - @Nullable ChatClientObservationConvention chatClientObservationConvention) { - return builder(chatModel, observationRegistry, chatClientObservationConvention, null); + return builder(chatModel, ObservationRegistry.NOOP, null, null); } static Builder builder(ChatModel chatModel, ObservationRegistry observationRegistry, diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java index 35358dcf1cf..81d6a43ac43 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClient.java @@ -668,23 +668,6 @@ public static class DefaultChatClientRequestSpec implements ChatClientRequestSpe ccr.advisorObservationConvention); } - /** - * @deprecated in favor of the other constructor. - */ - @Deprecated(since = "1.1.0", forRemoval = true) - public DefaultChatClientRequestSpec(ChatModel chatModel, @Nullable String userText, - Map userParams, Map userMetadata, @Nullable String systemText, - Map systemParams, Map systemMetadata, List toolCallbacks, - List toolCallbackProviders, List messages, List toolNames, - List media, @Nullable ChatOptions chatOptions, List advisors, - Map advisorParams, ObservationRegistry observationRegistry, - @Nullable ChatClientObservationConvention chatClientObservationConvention, - Map toolContext, @Nullable TemplateRenderer templateRenderer) { - this(chatModel, userText, userParams, userMetadata, systemText, systemParams, systemMetadata, toolCallbacks, - toolCallbackProviders, messages, toolNames, media, chatOptions, advisors, advisorParams, - observationRegistry, chatClientObservationConvention, toolContext, templateRenderer, null); - } - public DefaultChatClientRequestSpec(ChatModel chatModel, @Nullable String userText, Map userParams, Map userMetadata, @Nullable String systemText, Map systemParams, Map systemMetadata, List toolCallbacks, diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClientBuilder.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClientBuilder.java index dc77c74f066..0e667f6f380 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClientBuilder.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/DefaultChatClientBuilder.java @@ -58,17 +58,7 @@ public class DefaultChatClientBuilder implements Builder { protected final DefaultChatClientRequestSpec defaultRequest; DefaultChatClientBuilder(ChatModel chatModel) { - this(chatModel, ObservationRegistry.NOOP, null); - } - - /** - * @deprecated in favor of - * {@link #DefaultChatClientBuilder(ChatModel, ObservationRegistry, ChatClientObservationConvention, AdvisorObservationConvention)}. - */ - @Deprecated(since = "1.1.0", forRemoval = true) - public DefaultChatClientBuilder(ChatModel chatModel, ObservationRegistry observationRegistry, - @Nullable ChatClientObservationConvention chatClientObservationConvention) { - this(chatModel, observationRegistry, chatClientObservationConvention, null); + this(chatModel, ObservationRegistry.NOOP, null, null); } public DefaultChatClientBuilder(ChatModel chatModel, ObservationRegistry observationRegistry, diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluator.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluator.java index e22d1399fee..103e5d03796 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluator.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluator.java @@ -93,28 +93,14 @@ public class FactCheckingEvaluator implements Evaluator { private final String evaluationPrompt; - /** - * Constructs a new FactCheckingEvaluator with the provided ChatClient.Builder. Uses - * the default evaluation prompt suitable for general purpose LLMs. - * @param chatClientBuilder The builder for the ChatClient used to perform the - * evaluation - * @deprecated in favor of {@link #builder(ChatClient.Builder)} - */ - @Deprecated(forRemoval = true) - public FactCheckingEvaluator(ChatClient.Builder chatClientBuilder) { - this(chatClientBuilder, null); - } - /** * Constructs a new FactCheckingEvaluator with the provided ChatClient.Builder and * evaluation prompt. * @param chatClientBuilder The builder for the ChatClient used to perform the * evaluation * @param evaluationPrompt The prompt text to use for evaluation - * @deprecated in favor of {@link #builder(ChatClient.Builder)} */ - @Deprecated - public FactCheckingEvaluator(ChatClient.Builder chatClientBuilder, @Nullable String evaluationPrompt) { + protected FactCheckingEvaluator(ChatClient.Builder chatClientBuilder, @Nullable String evaluationPrompt) { Assert.notNull(chatClientBuilder, "chatClientBuilder cannot be null"); this.chatClientBuilder = chatClientBuilder; this.evaluationPrompt = evaluationPrompt != null ? evaluationPrompt : DEFAULT_EVALUATION_PROMPT_TEXT; diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientTests.java index 2ad21b0b009..a7e38611d8a 100644 --- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientTests.java +++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/ChatClientTests.java @@ -682,7 +682,7 @@ void whenCreateAndChatModelIsNullThenThrow() { @Test void whenCreateAndObservationRegistryIsNullThenThrow() { - assertThatThrownBy(() -> ChatClient.create(this.chatModel, null, null)) + assertThatThrownBy(() -> ChatClient.create(this.chatModel, null, null, null)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("observationRegistry cannot be null"); } @@ -695,7 +695,7 @@ void whenBuilderAndChatModelIsNullThenThrow() { @Test void whenBuilderAndObservationRegistryIsNullThenThrow() { - assertThatThrownBy(() -> ChatClient.builder(this.chatModel, null, null)) + assertThatThrownBy(() -> ChatClient.builder(this.chatModel, null, null, null)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("observationRegistry cannot be null"); } diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientBuilderTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientBuilderTests.java index d302ebf26f7..547e23cd7b2 100644 --- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientBuilderTests.java +++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientBuilderTests.java @@ -59,7 +59,7 @@ void whenChatModelIsNullThenThrows() { @Test void whenObservationRegistryIsNullThenThrows() { - assertThatThrownBy(() -> new DefaultChatClientBuilder(mock(ChatModel.class), null, null)) + assertThatThrownBy(() -> new DefaultChatClientBuilder(mock(ChatModel.class), null, null, null)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("the io.micrometer.observation.ObservationRegistry must be non-null"); } diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java index 20ea2e11bcd..9bc2732723c 100644 --- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java +++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/client/DefaultChatClientTests.java @@ -36,6 +36,7 @@ import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.chat.client.advisor.api.Advisor; import org.springframework.ai.chat.client.advisor.api.BaseAdvisorChain; +import org.springframework.ai.chat.client.advisor.observation.AdvisorObservationConvention; import org.springframework.ai.chat.client.observation.ChatClientObservationContext; import org.springframework.ai.chat.client.observation.ChatClientObservationConvention; import org.springframework.ai.chat.messages.AssistantMessage; @@ -852,7 +853,7 @@ void whenSimplePromptThenSetRequestAndResponseOnObservationContext() { given(chatModel.call(promptCaptor.capture())) .willReturn(new ChatResponse(List.of(new Generation(new AssistantMessage("response"))))); - ChatClient chatClient = new DefaultChatClientBuilder(chatModel, observationRegistry, null).build(); + ChatClient chatClient = new DefaultChatClientBuilder(chatModel, observationRegistry, null, null).build(); DefaultChatClient.DefaultChatClientRequestSpec chatClientRequestSpec = (DefaultChatClient.DefaultChatClientRequestSpec) chatClient .prompt("my question"); DefaultChatClient.DefaultCallResponseSpec spec = (DefaultChatClient.DefaultCallResponseSpec) chatClientRequestSpec @@ -1398,7 +1399,7 @@ void whenSimplePromptThenSetFluxResponseOnObservationContext() { given(chatModel.stream(promptCaptor.capture())) .willReturn(Flux.just(new ChatResponse(List.of(new Generation(new AssistantMessage("response")))))); - ChatClient chatClient = new DefaultChatClientBuilder(chatModel, observationRegistry, null).build(); + ChatClient chatClient = new DefaultChatClientBuilder(chatModel, observationRegistry, null, null).build(); DefaultChatClient.DefaultChatClientRequestSpec chatClientRequestSpec = (DefaultChatClient.DefaultChatClientRequestSpec) chatClient .prompt("my question"); DefaultChatClient.DefaultStreamResponseSpec spec = (DefaultChatClient.DefaultStreamResponseSpec) chatClientRequestSpec @@ -2176,8 +2177,10 @@ void whenDefaultChatClientBuilderWithObservationRegistryThenReturn() { var chatModel = mock(ChatModel.class); var observationRegistry = mock(ObservationRegistry.class); var observationConvention = mock(ChatClientObservationConvention.class); + var advisorObservationConvention = mock(AdvisorObservationConvention.class); - var builder = new DefaultChatClientBuilder(chatModel, observationRegistry, observationConvention); + var builder = new DefaultChatClientBuilder(chatModel, observationRegistry, observationConvention, + advisorObservationConvention); assertThat(builder).isNotNull(); } diff --git a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluatorTests.java b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluatorTests.java index ced7b831548..63bad62b8c9 100644 --- a/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluatorTests.java +++ b/spring-ai-client-chat/src/test/java/org/springframework/ai/chat/evaluation/FactCheckingEvaluatorTests.java @@ -36,7 +36,7 @@ class FactCheckingEvaluatorTests { @SuppressWarnings("deprecation") @Test void whenChatClientBuilderIsNullThenThrow() { - assertThatThrownBy(() -> new FactCheckingEvaluator(null)).isInstanceOf(IllegalArgumentException.class) + assertThatThrownBy(() -> new FactCheckingEvaluator(null, null)).isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("chatClientBuilder cannot be null"); assertThatThrownBy(() -> FactCheckingEvaluator.builder(null).build()) @@ -47,7 +47,7 @@ void whenChatClientBuilderIsNullThenThrow() { @SuppressWarnings("deprecation") @Test void whenEvaluationPromptIsNullThenUseDefaultEvaluationPromptText() { - FactCheckingEvaluator evaluator = new FactCheckingEvaluator(ChatClient.builder(mock(ChatModel.class))); + FactCheckingEvaluator evaluator = new FactCheckingEvaluator(ChatClient.builder(mock(ChatModel.class)), null); assertThat(evaluator).isNotNull(); evaluator = FactCheckingEvaluator.builder(ChatClient.builder(mock(ChatModel.class))).build(); diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat/deepseek-chat.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat/deepseek-chat.adoc index f1c6eefac49..a5362409c2d 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat/deepseek-chat.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/chat/deepseek-chat.adoc @@ -276,7 +276,7 @@ public String deepSeekReasonerMultiRoundExample() { String reasoningContent = deepSeekAssistantMessage.getReasoningContent(); String text = deepSeekAssistantMessage.getText(); - messages.add(new AssistantMessage(Objects.requireNonNull(text))); + messages.add(AssistantMessage.builder().content(Objects.requireNonNull(text)).build()); messages.add(new UserMessage("How many Rs are there in the word 'strawberry'?")); Prompt prompt2 = new Prompt(messages, promptOptions); ChatResponse response2 = chatModel.call(prompt2); diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-cohere-embedding.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-cohere-embedding.adoc index 6b67b31c7fd..3d243719946 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-cohere-embedding.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-cohere-embedding.adoc @@ -137,7 +137,7 @@ For example to override the default input type for a specific request: EmbeddingResponse embeddingResponse = embeddingModel.call( new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"), BedrockCohereEmbeddingOptions.builder() - .withInputType(InputType.SEARCH_DOCUMENT) + .inputType(InputType.SEARCH_DOCUMENT) .build())); ---- diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-titan-embedding.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-titan-embedding.adoc index 2cce947c316..7f6c245d209 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-titan-embedding.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/embeddings/bedrock-titan-embedding.adoc @@ -126,7 +126,7 @@ Model ID values can also be found in the https://docs.aws.amazon.com/bedrock/lat == Runtime Options [[embedding-options]] The https://github.com/spring-projects/spring-ai/blob/main/models/spring-ai-bedrock/src/main/java/org/springframework/ai/bedrock/titan/BedrockTitanEmbeddingOptions.java[BedrockTitanEmbeddingOptions.java] provides model configurations, such as `input-type`. -On start-up, the default options can be configured with the `BedrockTitanEmbeddingModel(api).withInputType(type)` method or the `spring.ai.bedrock.titan.embedding.input-type` properties. +On start-up, the default options can be configured with the `BedrockTitanEmbeddingOptions.builder().inputType(type).build()` method or the `spring.ai.bedrock.titan.embedding.input-type` properties. At run-time you can override the default options by adding new, request specific, options to the `EmbeddingRequest` call. For example to override the default temperature for a specific request: @@ -136,7 +136,7 @@ For example to override the default temperature for a specific request: EmbeddingResponse embeddingResponse = embeddingModel.call( new EmbeddingRequest(List.of("Hello World", "World is big and salvation is near"), BedrockTitanEmbeddingOptions.builder() - .withInputType(InputType.TEXT) + .inputType(InputType.TEXT) .build())); ---- diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/mcp/mcp-annotations-examples.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/mcp/mcp-annotations-examples.adoc index e90038ca972..48933398700 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/mcp/mcp-annotations-examples.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/mcp/mcp-annotations-examples.adoc @@ -252,7 +252,9 @@ public class ClientHandlers { if (msg.role() == Role.USER) { return new UserMessage(((TextContent) msg.content()).text()); } else { - return new AssistantMessage(((TextContent) msg.content()).text()); + return AssistantMessage.builder() + .content(((TextContent) msg.content()).text()) + .build(); } }) .toList(); diff --git a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/retrieval-augmented-generation.adoc b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/retrieval-augmented-generation.adoc index bca102a0cee..d1407d21945 100644 --- a/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/retrieval-augmented-generation.adoc +++ b/spring-ai-docs/src/main/antora/modules/ROOT/pages/api/retrieval-augmented-generation.adoc @@ -35,7 +35,7 @@ Assuming you have already loaded data into a `VectorStore`, you can perform Retr ---- ChatResponse response = ChatClient.builder(chatModel) .build().prompt() - .advisors(new QuestionAnswerAdvisor(vectorStore)) + .advisors(QuestionAnswerAdvisor.builder(vectorStore).build()) .user(userText) .call() .chatResponse(); diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java index 8d6d18dd40b..c1651258473 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java @@ -43,30 +43,10 @@ public class AssistantMessage extends AbstractMessage implements MediaContent { protected final List media; public AssistantMessage(String content) { - this(content, Map.of()); + this(content, Map.of(), List.of(), List.of()); } - /** - * @deprecated in favor of {@link AssistantMessage#builder()}. - */ - @Deprecated - public AssistantMessage(String content, Map properties) { - this(content, properties, List.of()); - } - - /** - * @deprecated in favor of {@link AssistantMessage#builder()}. - */ - @Deprecated - public AssistantMessage(String content, Map properties, List toolCalls) { - this(content, properties, toolCalls, List.of()); - } - - /** - * @deprecated in favor of {@link AssistantMessage#builder()}. - */ - @Deprecated - public AssistantMessage(String content, Map properties, List toolCalls, + protected AssistantMessage(String content, Map properties, List toolCalls, List media) { super(MessageType.ASSISTANT, content, properties); Assert.notNull(toolCalls, "Tool calls must not be null"); diff --git a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/ToolResponseMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/ToolResponseMessage.java index d0f9248453b..2fe179c6b74 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/ToolResponseMessage.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/ToolResponseMessage.java @@ -32,19 +32,7 @@ public class ToolResponseMessage extends AbstractMessage { protected final List responses; - /** - * @deprecated in favor of using {@link ToolResponseMessage.Builder} - */ - @Deprecated - public ToolResponseMessage(List responses) { - this(responses, Map.of()); - } - - /** - * @deprecated in favor of using {@link ToolResponseMessage.Builder} - */ - @Deprecated - public ToolResponseMessage(List responses, Map metadata) { + protected ToolResponseMessage(List responses, Map metadata) { super(MessageType.TOOL, "", metadata); this.responses = responses; } diff --git a/spring-ai-model/src/main/java/org/springframework/ai/embedding/DocumentEmbeddingRequest.java b/spring-ai-model/src/main/java/org/springframework/ai/embedding/DocumentEmbeddingRequest.java index 6fc754c1178..8bfedbef4be 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/embedding/DocumentEmbeddingRequest.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/embedding/DocumentEmbeddingRequest.java @@ -36,11 +36,11 @@ public class DocumentEmbeddingRequest implements ModelRequest> { private final EmbeddingOptions options; public DocumentEmbeddingRequest(Document... inputs) { - this(Arrays.asList(inputs), EmbeddingOptionsBuilder.builder().build()); + this(Arrays.asList(inputs), EmbeddingOptions.builder().build()); } public DocumentEmbeddingRequest(List inputs) { - this(inputs, EmbeddingOptionsBuilder.builder().build()); + this(inputs, EmbeddingOptions.builder().build()); } public DocumentEmbeddingRequest(List inputs, EmbeddingOptions options) { diff --git a/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingModel.java b/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingModel.java index 66dd852c8e1..04b0703cb8b 100644 --- a/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingModel.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingModel.java @@ -64,7 +64,7 @@ default float[] embed(String text) { */ default List embed(List texts) { Assert.notNull(texts, "Texts must not be null"); - return this.call(new EmbeddingRequest(texts, EmbeddingOptionsBuilder.builder().build())) + return this.call(new EmbeddingRequest(texts, EmbeddingOptions.builder().build())) .getResults() .stream() .map(Embedding::getOutput) @@ -105,7 +105,7 @@ default List embed(List documents, EmbeddingOptions options, */ default EmbeddingResponse embedForResponse(List texts) { Assert.notNull(texts, "Texts must not be null"); - return this.call(new EmbeddingRequest(texts, EmbeddingOptionsBuilder.builder().build())); + return this.call(new EmbeddingRequest(texts, EmbeddingOptions.builder().build())); } /** diff --git a/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingOptionsBuilder.java b/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingOptionsBuilder.java deleted file mode 100644 index f7b845ff257..00000000000 --- a/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingOptionsBuilder.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.embedding; - -/** - * Builder for {@link EmbeddingOptions}. - * - * @author Thomas Vitale - * @since 1.0.0 - * @deprecated in favor of {@link EmbeddingOptions#builder()} - */ -@Deprecated -public final class EmbeddingOptionsBuilder implements EmbeddingOptions.Builder { - - private final DefaultEmbeddingOptions embeddingOptions = new DefaultEmbeddingOptions(); - - private EmbeddingOptionsBuilder() { - } - - public static EmbeddingOptionsBuilder builder() { - return new EmbeddingOptionsBuilder(); - } - - public EmbeddingOptionsBuilder model(String model) { - this.embeddingOptions.setModel(model); - return this; - } - - @Deprecated - public EmbeddingOptionsBuilder withModel(String model) { - return model(model); - } - - public EmbeddingOptionsBuilder dimensions(Integer dimensions) { - this.embeddingOptions.setDimensions(dimensions); - return this; - } - - @Deprecated - public EmbeddingOptionsBuilder withDimensions(Integer dimensions) { - return dimensions(dimensions); - } - - public EmbeddingOptions build() { - return this.embeddingOptions; - } - -} diff --git a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/DefaultEmbeddingModelObservationConventionTests.java b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/DefaultEmbeddingModelObservationConventionTests.java index 81220b731b9..79493fa3a83 100644 --- a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/DefaultEmbeddingModelObservationConventionTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/DefaultEmbeddingModelObservationConventionTests.java @@ -26,7 +26,6 @@ import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.embedding.EmbeddingOptions; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; import org.springframework.ai.embedding.EmbeddingRequest; import org.springframework.ai.embedding.EmbeddingResponse; import org.springframework.ai.embedding.EmbeddingResponseMetadata; @@ -53,7 +52,7 @@ void shouldHaveName() { @Test void contextualNameWhenModelIsDefined() { EmbeddingModelObservationContext observationContext = EmbeddingModelObservationContext.builder() - .embeddingRequest(generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().model("mistral").build())) + .embeddingRequest(generateEmbeddingRequest(EmbeddingOptions.builder().model("mistral").build())) .provider("superprovider") .build(); assertThat(this.observationConvention.getContextualName(observationContext)).isEqualTo("embedding mistral"); @@ -62,7 +61,7 @@ void contextualNameWhenModelIsDefined() { @Test void contextualNameWhenModelIsNotDefined() { EmbeddingModelObservationContext observationContext = EmbeddingModelObservationContext.builder() - .embeddingRequest(generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().build())) + .embeddingRequest(generateEmbeddingRequest(EmbeddingOptions.builder().build())) .provider("superprovider") .build(); assertThat(this.observationConvention.getContextualName(observationContext)).isEqualTo("embedding"); @@ -71,7 +70,7 @@ void contextualNameWhenModelIsNotDefined() { @Test void supportsOnlyEmbeddingModelObservationContext() { EmbeddingModelObservationContext observationContext = EmbeddingModelObservationContext.builder() - .embeddingRequest(generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().model("supermodel").build())) + .embeddingRequest(generateEmbeddingRequest(EmbeddingOptions.builder().model("supermodel").build())) .provider("superprovider") .build(); assertThat(this.observationConvention.supportsContext(observationContext)).isTrue(); @@ -81,7 +80,7 @@ void supportsOnlyEmbeddingModelObservationContext() { @Test void shouldHaveLowCardinalityKeyValuesWhenDefined() { EmbeddingModelObservationContext observationContext = EmbeddingModelObservationContext.builder() - .embeddingRequest(generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().model("mistral").build())) + .embeddingRequest(generateEmbeddingRequest(EmbeddingOptions.builder().model("mistral").build())) .provider("superprovider") .build(); assertThat(this.observationConvention.getLowCardinalityKeyValues(observationContext)).contains( @@ -93,8 +92,8 @@ void shouldHaveLowCardinalityKeyValuesWhenDefined() { @Test void shouldHaveLowCardinalityKeyValuesWhenDefinedAndResponse() { EmbeddingModelObservationContext observationContext = EmbeddingModelObservationContext.builder() - .embeddingRequest(generateEmbeddingRequest( - EmbeddingOptionsBuilder.builder().model("mistral").dimensions(1492).build())) + .embeddingRequest( + generateEmbeddingRequest(EmbeddingOptions.builder().model("mistral").dimensions(1492).build())) .provider("superprovider") .build(); observationContext.setResponse(new EmbeddingResponse(List.of(), @@ -110,7 +109,7 @@ void shouldHaveLowCardinalityKeyValuesWhenDefinedAndResponse() { @Test void shouldNotHaveKeyValuesWhenMissing() { EmbeddingModelObservationContext observationContext = EmbeddingModelObservationContext.builder() - .embeddingRequest(generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().build())) + .embeddingRequest(generateEmbeddingRequest(EmbeddingOptions.builder().build())) .provider("superprovider") .build(); assertThat(this.observationConvention.getLowCardinalityKeyValues(observationContext)) diff --git a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelMeterObservationHandlerTests.java b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelMeterObservationHandlerTests.java index d483fb7d023..81ff82f58a3 100644 --- a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelMeterObservationHandlerTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelMeterObservationHandlerTests.java @@ -29,7 +29,6 @@ import org.springframework.ai.chat.metadata.Usage; import org.springframework.ai.embedding.EmbeddingOptions; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; import org.springframework.ai.embedding.EmbeddingRequest; import org.springframework.ai.embedding.EmbeddingResponse; import org.springframework.ai.embedding.EmbeddingResponseMetadata; @@ -93,7 +92,7 @@ void shouldCreateAllMetersDuringAnObservation() { private EmbeddingModelObservationContext generateObservationContext() { return EmbeddingModelObservationContext.builder() - .embeddingRequest(generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().model("mistral").build())) + .embeddingRequest(generateEmbeddingRequest(EmbeddingOptions.builder().model("mistral").build())) .provider("superprovider") .build(); } diff --git a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContextTests.java b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContextTests.java index b2e918f5b20..fb538847f57 100644 --- a/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContextTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/embedding/observation/EmbeddingModelObservationContextTests.java @@ -21,7 +21,6 @@ import org.junit.jupiter.api.Test; import org.springframework.ai.embedding.EmbeddingOptions; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; import org.springframework.ai.embedding.EmbeddingRequest; import static org.assertj.core.api.Assertions.assertThat; @@ -37,7 +36,7 @@ class EmbeddingModelObservationContextTests { @Test void whenMandatoryRequestOptionsThenReturn() { var observationContext = EmbeddingModelObservationContext.builder() - .embeddingRequest(generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().model("supermodel").build())) + .embeddingRequest(generateEmbeddingRequest(EmbeddingOptions.builder().model("supermodel").build())) .provider("superprovider") .build(); @@ -54,7 +53,7 @@ void whenBuilderWithNullRequestThenThrowsException() { @Test void whenBuilderWithNullProviderThenThrowsException() { - var embeddingRequest = generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().model("test-model").build()); + var embeddingRequest = generateEmbeddingRequest(EmbeddingOptions.builder().model("test-model").build()); assertThatThrownBy(() -> EmbeddingModelObservationContext.builder() .embeddingRequest(embeddingRequest) @@ -64,7 +63,7 @@ void whenBuilderWithNullProviderThenThrowsException() { @Test void whenBuilderWithEmptyProviderThenThrowsException() { - var embeddingRequest = generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().model("test-model").build()); + var embeddingRequest = generateEmbeddingRequest(EmbeddingOptions.builder().model("test-model").build()); assertThatThrownBy(() -> EmbeddingModelObservationContext.builder() .embeddingRequest(embeddingRequest) @@ -74,7 +73,7 @@ void whenBuilderWithEmptyProviderThenThrowsException() { @Test void whenValidRequestAndProviderThenBuildsSuccessfully() { - var embeddingRequest = generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().model("test-model").build()); + var embeddingRequest = generateEmbeddingRequest(EmbeddingOptions.builder().model("test-model").build()); var observationContext = EmbeddingModelObservationContext.builder() .embeddingRequest(embeddingRequest) @@ -86,7 +85,7 @@ void whenValidRequestAndProviderThenBuildsSuccessfully() { @Test void whenBuilderWithBlankProviderThenThrowsException() { - var embeddingRequest = generateEmbeddingRequest(EmbeddingOptionsBuilder.builder().model("test-model").build()); + var embeddingRequest = generateEmbeddingRequest(EmbeddingOptions.builder().model("test-model").build()); assertThatThrownBy(() -> EmbeddingModelObservationContext.builder() .embeddingRequest(embeddingRequest) @@ -108,8 +107,7 @@ void whenEmbeddingRequestWithNullOptionsThenBuildsSuccessfully() { @Test void whenEmbeddingRequestWithEmptyInputListThenBuildsSuccessfully() { - var embeddingRequest = new EmbeddingRequest(List.of(), - EmbeddingOptionsBuilder.builder().model("test-model").build()); + var embeddingRequest = new EmbeddingRequest(List.of(), EmbeddingOptions.builder().model("test-model").build()); var observationContext = EmbeddingModelObservationContext.builder() .embeddingRequest(embeddingRequest) diff --git a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java index a09cbf81466..c542d43aa7d 100644 --- a/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java +++ b/vector-stores/spring-ai-azure-cosmos-db-store/src/main/java/org/springframework/ai/vectorstore/cosmosdb/CosmosDBVectorStore.java @@ -60,7 +60,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; import org.springframework.ai.vectorstore.SearchRequest; @@ -225,7 +225,7 @@ private JsonNode mapCosmosDocument(Document document, float[] queryEmbedding) { public void doAdd(List documents) { // Batch the documents based on the batching strategy - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); // Create a list to hold both the CosmosItemOperation and the corresponding 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 4ef85c4d24d..b25ecd7c4cc 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 @@ -49,7 +49,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; @@ -160,7 +160,7 @@ public void doAdd(List documents) { return; // nothing to do; } - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); final var searchDocuments = documents.stream().map(document -> { diff --git a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java index 664565a3694..96ef32bc5fb 100644 --- a/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java +++ b/vector-stores/spring-ai-cassandra-store/src/main/java/org/springframework/ai/vectorstore/cassandra/CassandraVectorStore.java @@ -70,7 +70,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; @@ -267,7 +267,7 @@ private static Float[] toFloatArray(float[] embedding) { public void doAdd(List documents) { var futures = new CompletableFuture[documents.size()]; - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); int i = 0; 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 bb9468cd285..c34a785d422 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 @@ -34,7 +34,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.util.JacksonUtils; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -158,8 +158,8 @@ public void doAdd(List documents) { List contents = new ArrayList<>(); List embeddings = new ArrayList<>(); - List documentEmbeddings = this.embeddingModel.embed(documents, - EmbeddingOptionsBuilder.builder().build(), this.batchingStrategy); + List documentEmbeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), + this.batchingStrategy); for (Document document : documents) { ids.add(document.getId()); diff --git a/vector-stores/spring-ai-couchbase-store/src/main/java/org/springframework/ai/vectorstore/CouchbaseSearchVectorStore.java b/vector-stores/spring-ai-couchbase-store/src/main/java/org/springframework/ai/vectorstore/CouchbaseSearchVectorStore.java index ad0ebc95a1d..8025a3c7ee9 100644 --- a/vector-stores/spring-ai-couchbase-store/src/main/java/org/springframework/ai/vectorstore/CouchbaseSearchVectorStore.java +++ b/vector-stores/spring-ai-couchbase-store/src/main/java/org/springframework/ai/vectorstore/CouchbaseSearchVectorStore.java @@ -42,7 +42,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.vectorstore.filter.Filter; import org.springframework.ai.vectorstore.observation.AbstractObservationVectorStore; @@ -137,7 +137,7 @@ public void doAdd(List documents) { logger.info("Trying Add"); logger.info(this.bucketName); logger.info(this.scopeName); - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); for (Document document : documents) { CouchbaseDocument cbDoc = new CouchbaseDocument(document.getId(), document.getText(), diff --git a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java index fc77e4f01f5..c7f4945fb78 100644 --- a/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java +++ b/vector-stores/spring-ai-elasticsearch-store/src/main/java/org/springframework/ai/vectorstore/elasticsearch/ElasticsearchVectorStore.java @@ -40,7 +40,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; @@ -178,7 +178,7 @@ protected ElasticsearchVectorStore(Builder builder) { public void doAdd(List documents) { BulkRequest.Builder bulkRequestBuilder = new BulkRequest.Builder(); - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); for (int i = 0; i < embeddings.size(); i++) { diff --git a/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java b/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java index cf4e1c1c0c6..fea22ff784d 100644 --- a/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java +++ b/vector-stores/spring-ai-gemfire-store/src/main/java/org/springframework/ai/vectorstore/gemfire/GemFireVectorStore.java @@ -32,7 +32,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.util.JacksonUtils; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -206,7 +206,7 @@ public String getIndex() { @Override public void doAdd(List documents) { - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); UploadRequest upload = new UploadRequest(documents.stream() .map(document -> new UploadRequest.Embedding(document.getId(), embeddings.get(documents.indexOf(document)), diff --git a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java index 52981d5faff..dfe737f5791 100644 --- a/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java +++ b/vector-stores/spring-ai-mariadb-store/src/main/java/org/springframework/ai/vectorstore/mariadb/MariaDBVectorStore.java @@ -33,7 +33,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.util.JacksonUtils; @@ -251,7 +251,7 @@ public MariaDBDistanceType getDistanceType() { @Override public void doAdd(List documents) { // Batch the documents based on the batching strategy - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); List> batchedDocuments = batchDocuments(documents, embeddings); diff --git a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java index 3b710cef329..a2fd852c952 100644 --- a/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java +++ b/vector-stores/spring-ai-milvus-store/src/main/java/org/springframework/ai/vectorstore/milvus/MilvusVectorStore.java @@ -59,7 +59,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; @@ -242,7 +242,7 @@ public void doAdd(List documents) { List> embeddingArray = new ArrayList<>(); // TODO: Need to customize how we pass the embedding options - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); for (Document document : documents) { diff --git a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java index 5c40ceaf208..125a8bcef3f 100644 --- a/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java +++ b/vector-stores/spring-ai-mongodb-atlas-store/src/main/java/org/springframework/ai/vectorstore/mongodb/atlas/MongoDBAtlasVectorStore.java @@ -30,7 +30,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -258,7 +258,7 @@ private Document mapMongoDocument(org.bson.Document mongoDocument, float[] query @Override public void doAdd(List documents) { - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); for (Document document : documents) { MongoDBDocument mdbDocument = new MongoDBDocument(document.getId(), document.getText(), diff --git a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java index 7d44aa2a9ad..d0ef1bb90a1 100644 --- a/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java +++ b/vector-stores/spring-ai-neo4j-store/src/main/java/org/springframework/ai/vectorstore/neo4j/Neo4jVectorStore.java @@ -31,7 +31,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -136,9 +136,6 @@ public class Neo4jVectorStore extends AbstractObservationVectorStore implements private static final Logger logger = LoggerFactory.getLogger(Neo4jVectorStore.class); - @Deprecated(forRemoval = true) - public static final int DEFAULT_EMBEDDING_DIMENSION = 1536; - public static final int DEFAULT_TRANSACTION_SIZE = 10_000; public static final String DEFAULT_LABEL = "Document"; @@ -205,7 +202,7 @@ protected Neo4jVectorStore(Builder builder) { @Override public void doAdd(List documents) { - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); var rows = documents.stream() diff --git a/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java b/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java index 6de9a50e731..b1a80fdc8c9 100644 --- a/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java +++ b/vector-stores/spring-ai-opensearch-store/src/main/java/org/springframework/ai/vectorstore/opensearch/OpenSearchVectorStore.java @@ -44,7 +44,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -210,7 +210,7 @@ public OpenSearchVectorStore withSimilarityFunction(String similarityFunction) { @Override public void doAdd(List documents) { - List embedding = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embedding = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); BulkRequest.Builder bulkRequestBuilder = new BulkRequest.Builder(); for (Document document : documents) { diff --git a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java index 4f70c74dde6..0ab335abbd4 100644 --- a/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java +++ b/vector-stores/spring-ai-oracle-store/src/main/java/org/springframework/ai/vectorstore/oracle/OracleVectorStore.java @@ -40,7 +40,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -168,7 +168,7 @@ public static Builder builder(JdbcTemplate jdbcTemplate, EmbeddingModel embeddin @Override public void doAdd(final List documents) { - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); this.jdbcTemplate.batchUpdate(getIngestStatement(), new BatchPreparedStatementSetter() { diff --git a/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java b/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java index b77d9b9b11e..8c26acdede3 100644 --- a/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java +++ b/vector-stores/spring-ai-pinecone-store/src/main/java/org/springframework/ai/vectorstore/pinecone/PineconeVectorStore.java @@ -37,7 +37,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -137,7 +137,7 @@ public static Builder.BuilderWithApiKey builder(EmbeddingModel embeddingModel) { * @param namespace The namespace to add the documents to */ public void add(List documents, String namespace) { - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); List upsertVectors = new ArrayList<>(); for (Document document : documents) { 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 e06da8a4f9d..530117e173f 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 @@ -37,7 +37,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -176,7 +176,7 @@ public void doAdd(List documents) { try { // Compute and assign an embedding to the document. - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); List points = documents.stream() diff --git a/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java index 67d033fb2cf..91e02a94e66 100644 --- a/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java +++ b/vector-stores/spring-ai-redis-store/src/main/java/org/springframework/ai/vectorstore/redis/RedisVectorStore.java @@ -48,7 +48,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -253,7 +253,7 @@ public JedisPooled getJedis() { public void doAdd(List documents) { try (Pipeline pipeline = this.jedis.pipelined()) { - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); for (Document document : documents) { diff --git a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java index caeed19b54c..46794ea60a7 100644 --- a/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java +++ b/vector-stores/spring-ai-typesense-store/src/main/java/org/springframework/ai/vectorstore/typesense/TypesenseVectorStore.java @@ -40,7 +40,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.observation.conventions.VectorStoreSimilarityMetric; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -141,7 +141,7 @@ public static Builder builder(Client client, EmbeddingModel embeddingModel) { public void doAdd(List documents) { Assert.notNull(documents, "Documents must not be null"); - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); List> documentList = documents.stream().map(document -> { diff --git a/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java b/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java index 28f29d18c1d..fa5a8fce83d 100644 --- a/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java +++ b/vector-stores/spring-ai-weaviate-store/src/main/java/org/springframework/ai/vectorstore/weaviate/WeaviateVectorStore.java @@ -49,7 +49,7 @@ import org.springframework.ai.document.Document; import org.springframework.ai.document.DocumentMetadata; import org.springframework.ai.embedding.EmbeddingModel; -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; +import org.springframework.ai.embedding.EmbeddingOptions; import org.springframework.ai.model.EmbeddingUtils; import org.springframework.ai.observation.conventions.VectorStoreProvider; import org.springframework.ai.vectorstore.AbstractVectorStoreBuilder; @@ -201,7 +201,7 @@ public void doAdd(List documents) { return; } - List embeddings = this.embeddingModel.embed(documents, EmbeddingOptionsBuilder.builder().build(), + List embeddings = this.embeddingModel.embed(documents, EmbeddingOptions.builder().build(), this.batchingStrategy); List weaviateObjects = documents.stream() @@ -546,22 +546,6 @@ private Builder(WeaviateClient weaviateClient, EmbeddingModel embeddingModel) { this.weaviateClient = weaviateClient; } - /** - * Configures the Weaviate object class. - * @param objectClass the object class to use - * @return this builder instance - * @throws IllegalArgumentException if objectClass is null or empty - * @deprecated Use - * {@link org.springframework.ai.vectorstore.weaviate.WeaviateVectorStore.Builder#options(WeaviateVectorStoreOptions)} - * instead. - */ - @Deprecated - public Builder objectClass(String objectClass) { - Assert.hasText(objectClass, "objectClass must not be empty"); - this.options.setObjectClass(objectClass); - return this; - } - /** * Configures the Weaviate vector store option. * @param options the vector store options to use