From d12b313e24031b24a1e0da96fd04ab4db7e7b8e5 Mon Sep 17 00:00:00 2001 From: Thomas Vitale Date: Sat, 3 Jan 2026 13:14:42 +0100 Subject: [PATCH] deps: Update Spring Boot 3.3 to 3.5 * Upgrade to Spring Boot 3.5.9 * Remove deprecations from previous Spring Boot versions * Rely on Testcontainers version from Spring Boot * Bump Maven plugin dependencies * Fix class visibility issues in some Properties classes * Remove Lombok from Mistral AI because not working on Java 25 * Run automated tests on GHA also for Java 25 Signed-off-by: Thomas Vitale --- .github/workflows/main.yaml | 2 +- .gitignore | 2 + .mvn/wrapper/maven-wrapper.jar | Bin 63028 -> 63093 bytes .mvn/wrapper/maven-wrapper.properties | 4 +- .sdkmanrc | 2 +- .../anthropic/spring/ChatModelProperties.java | 2 +- .../pom.xml | 2 +- .../spring/ChatModelProperties.java | 2 +- .../spring/EmbeddingModelProperties.java | 2 +- .../spring/ChatModelProperties.java | 2 +- .../spring/EmbeddingModelProperties.java | 2 +- .../spring/GeminiFunctionCallingConfig.java | 2 +- .../spring/restclient/SpringRestClient.java | 8 +- .../spring/restclient/SpringRestClientIT.java | 4 +- .../restclient/SpringRestClientTimeoutIT.java | 4 +- .../pom.xml | 7 - .../mistralai/spring/AutoConfig.java | 173 +++++++++--------- .../mistralai/spring/ChatModelProperties.java | 42 ++--- .../spring/EmbeddingModelProperties.java | 23 +-- .../mistralai/spring/FimModelProperties.java | 35 ++-- .../spring/ModerationModelProperties.java | 23 +-- .../mistralai/spring/Properties.java | 66 +++++-- .../ollama/spring/ChatModelProperties.java | 2 +- .../spring/EmbeddingModelProperties.java | 2 +- .../spring/LanguageModelProperties.java | 2 +- langchain4j-spring-boot-tests/pom.xml | 2 +- mvnw | 30 +-- mvnw.cmd | 6 +- pom.xml | 29 +-- 29 files changed, 248 insertions(+), 234 deletions(-) diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index a2e2ab58..3b72923c 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -12,7 +12,7 @@ jobs: java_build: strategy: matrix: - java_version: [ 17, 21, 22, 23 ] + java_version: [ 17, 21, 25 ] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 diff --git a/.gitignore b/.gitignore index 9dce8548..438f41ff 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,5 @@ build/ ### .env files contain local environment variables ### .env + +*.log diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar index 7967f30dd1d25fe1b79a4a6e50e2aaa0e425c02c..eebc3c18b4e0bce4a2a9e66be24c4a410f17a1fa 100644 GIT binary patch delta 5797 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 delta 5783 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 Y0nj}fSlKkVQAz{)dkB23nN#xr0ccu%S^xk5 diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties index 546a64e7..c7c5d3fc 100644 --- a/.mvn/wrapper/maven-wrapper.properties +++ b/.mvn/wrapper/maven-wrapper.properties @@ -16,5 +16,5 @@ # under the License. wrapperVersion=3.3.2 distributionType=only-script -distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip -distributionSha256Sum=0d7125e8c91097b36edb990ea5934e6c68b4440eef4ea96510a0f6815e7eeadb +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.12/apache-maven-3.9.12-bin.zip +distributionSha256Sum=305773a68d6ddfd413df58c82b3f8050e89778e777f3a745c8e5b8cbea4018ef diff --git a/.sdkmanrc b/.sdkmanrc index 45ff88fd..c74203c2 100644 --- a/.sdkmanrc +++ b/.sdkmanrc @@ -3,4 +3,4 @@ # See https://sdkman.io/usage#config # A summary is to add the following to ~/.sdkman/etc/config # sdkman_auto_env=true -java=17.0.14-tem \ No newline at end of file +java=17.0.17-tem \ No newline at end of file diff --git a/langchain4j-anthropic-spring-boot-starter/src/main/java/dev/langchain4j/anthropic/spring/ChatModelProperties.java b/langchain4j-anthropic-spring-boot-starter/src/main/java/dev/langchain4j/anthropic/spring/ChatModelProperties.java index fe8de6f6..91561aca 100644 --- a/langchain4j-anthropic-spring-boot-starter/src/main/java/dev/langchain4j/anthropic/spring/ChatModelProperties.java +++ b/langchain4j-anthropic-spring-boot-starter/src/main/java/dev/langchain4j/anthropic/spring/ChatModelProperties.java @@ -6,7 +6,7 @@ import java.util.List; import java.util.Map; -class ChatModelProperties { +public class ChatModelProperties { String baseUrl; String apiKey; diff --git a/langchain4j-elasticsearch-spring-boot-starter/pom.xml b/langchain4j-elasticsearch-spring-boot-starter/pom.xml index d581605d..00174bd9 100644 --- a/langchain4j-elasticsearch-spring-boot-starter/pom.xml +++ b/langchain4j-elasticsearch-spring-boot-starter/pom.xml @@ -101,7 +101,7 @@ commons-io commons-io - 2.18.0 + 2.21.0 test diff --git a/langchain4j-github-models-spring-boot-starter/src/main/java/dev/langchain4j/model/githubmodels/spring/ChatModelProperties.java b/langchain4j-github-models-spring-boot-starter/src/main/java/dev/langchain4j/model/githubmodels/spring/ChatModelProperties.java index 5c205847..3d913253 100644 --- a/langchain4j-github-models-spring-boot-starter/src/main/java/dev/langchain4j/model/githubmodels/spring/ChatModelProperties.java +++ b/langchain4j-github-models-spring-boot-starter/src/main/java/dev/langchain4j/model/githubmodels/spring/ChatModelProperties.java @@ -3,7 +3,7 @@ import java.time.Duration; import java.util.List; -class ChatModelProperties { +public class ChatModelProperties { private String endpoint; private String gitHubToken; diff --git a/langchain4j-github-models-spring-boot-starter/src/main/java/dev/langchain4j/model/githubmodels/spring/EmbeddingModelProperties.java b/langchain4j-github-models-spring-boot-starter/src/main/java/dev/langchain4j/model/githubmodels/spring/EmbeddingModelProperties.java index 189f72cf..d1c0fe83 100644 --- a/langchain4j-github-models-spring-boot-starter/src/main/java/dev/langchain4j/model/githubmodels/spring/EmbeddingModelProperties.java +++ b/langchain4j-github-models-spring-boot-starter/src/main/java/dev/langchain4j/model/githubmodels/spring/EmbeddingModelProperties.java @@ -2,7 +2,7 @@ import java.time.Duration; -class EmbeddingModelProperties { +public class EmbeddingModelProperties { private String endpoint; private String gitHubToken; diff --git a/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/ChatModelProperties.java b/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/ChatModelProperties.java index 02eeafc0..fdd8beff 100644 --- a/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/ChatModelProperties.java +++ b/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/ChatModelProperties.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -record ChatModelProperties( +public record ChatModelProperties( String apiKey, String baseUrl, String modelName, diff --git a/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/EmbeddingModelProperties.java b/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/EmbeddingModelProperties.java index d5e3b90c..b6d9ff29 100644 --- a/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/EmbeddingModelProperties.java +++ b/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/EmbeddingModelProperties.java @@ -4,7 +4,7 @@ import java.time.Duration; -record EmbeddingModelProperties( +public record EmbeddingModelProperties( String apiKey, String modelName, String titleMetadataKey, diff --git a/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/GeminiFunctionCallingConfig.java b/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/GeminiFunctionCallingConfig.java index 32f6c3b4..a5bc5090 100644 --- a/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/GeminiFunctionCallingConfig.java +++ b/langchain4j-google-ai-gemini-spring-boot-starter/src/main/java/dev/langchain4j/googleaigemini/spring/GeminiFunctionCallingConfig.java @@ -4,7 +4,7 @@ import java.util.List; -record GeminiFunctionCallingConfig( +public record GeminiFunctionCallingConfig( GeminiMode geminiMode, List allowedFunctionNames ) { diff --git a/langchain4j-http-client-spring-restclient/src/main/java/dev/langchain4j/http/client/spring/restclient/SpringRestClient.java b/langchain4j-http-client-spring-restclient/src/main/java/dev/langchain4j/http/client/spring/restclient/SpringRestClient.java index c9965a22..dd4da11b 100644 --- a/langchain4j-http-client-spring-restclient/src/main/java/dev/langchain4j/http/client/spring/restclient/SpringRestClient.java +++ b/langchain4j-http-client-spring-restclient/src/main/java/dev/langchain4j/http/client/spring/restclient/SpringRestClient.java @@ -7,8 +7,8 @@ import dev.langchain4j.http.client.SuccessfulHttpResponse; import dev.langchain4j.http.client.sse.ServerSentEventListener; import dev.langchain4j.http.client.sse.ServerSentEventParser; -import org.springframework.boot.web.client.ClientHttpRequestFactories; -import org.springframework.boot.web.client.ClientHttpRequestFactorySettings; +import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder; +import org.springframework.boot.http.client.ClientHttpRequestFactorySettings; import org.springframework.core.task.AsyncTaskExecutor; import org.springframework.http.ResponseEntity; import org.springframework.http.client.ClientHttpRequestFactory; @@ -31,14 +31,14 @@ public SpringRestClient(SpringRestClientBuilder builder) { RestClient.Builder restClientBuilder = getOrDefault(builder.restClientBuilder(), RestClient::builder); - ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings.DEFAULTS; + ClientHttpRequestFactorySettings settings = ClientHttpRequestFactorySettings.defaults(); if (builder.connectTimeout() != null) { settings = settings.withConnectTimeout(builder.connectTimeout()); } if (builder.readTimeout() != null) { settings = settings.withReadTimeout(builder.readTimeout()); } - ClientHttpRequestFactory clientHttpRequestFactory = ClientHttpRequestFactories.get(settings); + ClientHttpRequestFactory clientHttpRequestFactory = ClientHttpRequestFactoryBuilder.detect().build(settings); this.delegate = restClientBuilder .requestFactory(clientHttpRequestFactory) diff --git a/langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientIT.java b/langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientIT.java index 22d24b0c..46ea72a2 100644 --- a/langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientIT.java +++ b/langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientIT.java @@ -6,7 +6,7 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.JdkClientHttpRequestFactory; -import org.springframework.http.client.ReactorNettyClientRequestFactory; +import org.springframework.http.client.ReactorClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestClient; @@ -25,7 +25,7 @@ protected List clients() { .restClientBuilder(RestClient.builder().requestFactory(new HttpComponentsClientHttpRequestFactory())) .build(), SpringRestClient.builder() - .restClientBuilder(RestClient.builder().requestFactory(new ReactorNettyClientRequestFactory())) + .restClientBuilder(RestClient.builder().requestFactory(new ReactorClientHttpRequestFactory())) .build(), SpringRestClient.builder() .restClientBuilder(RestClient.builder().requestFactory(new SimpleClientHttpRequestFactory())) diff --git a/langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientTimeoutIT.java b/langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientTimeoutIT.java index ab5ba917..274ab0ab 100644 --- a/langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientTimeoutIT.java +++ b/langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientTimeoutIT.java @@ -4,7 +4,7 @@ import dev.langchain4j.http.client.HttpClientTimeoutIT; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.http.client.JdkClientHttpRequestFactory; -import org.springframework.http.client.ReactorNettyClientRequestFactory; +import org.springframework.http.client.ReactorClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestClient; @@ -26,7 +26,7 @@ protected List clients(Duration readTimeout) { .readTimeout(readTimeout) .build(), SpringRestClient.builder() - .restClientBuilder(RestClient.builder().requestFactory(new ReactorNettyClientRequestFactory())) + .restClientBuilder(RestClient.builder().requestFactory(new ReactorClientHttpRequestFactory())) .readTimeout(readTimeout) .build(), SpringRestClient.builder() diff --git a/langchain4j-mistral-ai-spring-boot-starter/pom.xml b/langchain4j-mistral-ai-spring-boot-starter/pom.xml index 9855c017..438b2a6f 100644 --- a/langchain4j-mistral-ai-spring-boot-starter/pom.xml +++ b/langchain4j-mistral-ai-spring-boot-starter/pom.xml @@ -44,13 +44,6 @@ true - - - org.projectlombok - lombok - provided - - org.springframework.boot diff --git a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/AutoConfig.java b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/AutoConfig.java index 53efcfdd..e993b6d1 100644 --- a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/AutoConfig.java +++ b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/AutoConfig.java @@ -1,7 +1,14 @@ package dev.langchain4j.mistralai.spring; -import static dev.langchain4j.mistralai.spring.Properties.PREFIX; - +import dev.langchain4j.http.client.HttpClientBuilder; +import dev.langchain4j.http.client.spring.restclient.SpringRestClient; +import dev.langchain4j.model.chat.listener.ChatModelListener; +import dev.langchain4j.model.mistralai.MistralAiChatModel; +import dev.langchain4j.model.mistralai.MistralAiEmbeddingModel; +import dev.langchain4j.model.mistralai.MistralAiFimModel; +import dev.langchain4j.model.mistralai.MistralAiModerationModel; +import dev.langchain4j.model.mistralai.MistralAiStreamingChatModel; +import dev.langchain4j.model.mistralai.MistralAiStreamingFimModel; import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -16,15 +23,7 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.web.client.RestClient; -import dev.langchain4j.http.client.HttpClientBuilder; -import dev.langchain4j.http.client.spring.restclient.SpringRestClient; -import dev.langchain4j.model.chat.listener.ChatModelListener; -import dev.langchain4j.model.mistralai.MistralAiChatModel; -import dev.langchain4j.model.mistralai.MistralAiEmbeddingModel; -import dev.langchain4j.model.mistralai.MistralAiFimModel; -import dev.langchain4j.model.mistralai.MistralAiModerationModel; -import dev.langchain4j.model.mistralai.MistralAiStreamingChatModel; -import dev.langchain4j.model.mistralai.MistralAiStreamingFimModel; +import static dev.langchain4j.mistralai.spring.Properties.PREFIX; @AutoConfiguration @EnableConfigurationProperties(Properties.class) @@ -55,29 +54,29 @@ MistralAiChatModel mistralAiChatModel( ChatModelProperties chatModelProperties = properties.getChatModel(); MistralAiChatModel.MistralAiChatModelBuilder builder = MistralAiChatModel.builder() .httpClientBuilder(httpClientBuilder) - .baseUrl(chatModelProperties.getBaseUrl()) - .apiKey(chatModelProperties.getApiKey()) - .modelName(chatModelProperties.getModelName()) - .temperature(chatModelProperties.getTemperature()) - .topP(chatModelProperties.getTopP()) - .maxTokens(chatModelProperties.getMaxTokens()) - .safePrompt(chatModelProperties.getSafePrompt()) - .randomSeed(chatModelProperties.getRandomSeed()) - .responseFormat(chatModelProperties.getResponseFormat()) - .stopSequences(chatModelProperties.getStopSequences()) - .frequencyPenalty(chatModelProperties.getFrequencyPenalty()) - .presencePenalty(chatModelProperties.getPresencePenalty()) - .timeout(chatModelProperties.getTimeout()) - .logRequests(chatModelProperties.getLogRequests()) - .logResponses(chatModelProperties.getLogResponses()) + .baseUrl(chatModelProperties.baseUrl()) + .apiKey(chatModelProperties.apiKey()) + .modelName(chatModelProperties.modelName()) + .temperature(chatModelProperties.temperature()) + .topP(chatModelProperties.topP()) + .maxTokens(chatModelProperties.maxTokens()) + .safePrompt(chatModelProperties.safePrompt()) + .randomSeed(chatModelProperties.randomSeed()) + .responseFormat(chatModelProperties.responseFormat()) + .stopSequences(chatModelProperties.stopSequences()) + .frequencyPenalty(chatModelProperties.frequencyPenalty()) + .presencePenalty(chatModelProperties.presencePenalty()) + .timeout(chatModelProperties.timeout()) + .logRequests(chatModelProperties.logRequests()) + .logResponses(chatModelProperties.logResponses()) .listeners(listeners.orderedStream().toList()); // Conditional parameters to avoid NPE in Mistral AI models - if (chatModelProperties.getMaxRetries() != null) { - builder.maxRetries(chatModelProperties.getMaxRetries()); + if (chatModelProperties.maxRetries() != null) { + builder.maxRetries(chatModelProperties.maxRetries()); } - if (chatModelProperties.getSupportedCapabilities() != null) { - builder.supportedCapabilities(chatModelProperties.getSupportedCapabilities()); + if (chatModelProperties.supportedCapabilities() != null) { + builder.supportedCapabilities(chatModelProperties.supportedCapabilities()); } return builder.build(); @@ -102,26 +101,26 @@ MistralAiStreamingChatModel mistralAiStreamingChatModel( ChatModelProperties chatModelProperties = properties.getStreamingChatModel(); MistralAiStreamingChatModel.MistralAiStreamingChatModelBuilder builder = MistralAiStreamingChatModel.builder() .httpClientBuilder(httpClientBuilder) - .baseUrl(chatModelProperties.getBaseUrl()) - .apiKey(chatModelProperties.getApiKey()) - .modelName(chatModelProperties.getModelName()) - .temperature(chatModelProperties.getTemperature()) - .topP(chatModelProperties.getTopP()) - .maxTokens(chatModelProperties.getMaxTokens()) - .safePrompt(chatModelProperties.getSafePrompt()) - .randomSeed(chatModelProperties.getRandomSeed()) - .responseFormat(chatModelProperties.getResponseFormat()) - .stopSequences(chatModelProperties.getStopSequences()) - .frequencyPenalty(chatModelProperties.getFrequencyPenalty()) - .presencePenalty(chatModelProperties.getPresencePenalty()) - .timeout(chatModelProperties.getTimeout()) - .logRequests(chatModelProperties.getLogRequests()) - .logResponses(chatModelProperties.getLogResponses()) + .baseUrl(chatModelProperties.baseUrl()) + .apiKey(chatModelProperties.apiKey()) + .modelName(chatModelProperties.modelName()) + .temperature(chatModelProperties.temperature()) + .topP(chatModelProperties.topP()) + .maxTokens(chatModelProperties.maxTokens()) + .safePrompt(chatModelProperties.safePrompt()) + .randomSeed(chatModelProperties.randomSeed()) + .responseFormat(chatModelProperties.responseFormat()) + .stopSequences(chatModelProperties.stopSequences()) + .frequencyPenalty(chatModelProperties.frequencyPenalty()) + .presencePenalty(chatModelProperties.presencePenalty()) + .timeout(chatModelProperties.timeout()) + .logRequests(chatModelProperties.logRequests()) + .logResponses(chatModelProperties.logResponses()) .listeners(listeners.orderedStream().toList()); // Conditional parameters to avoid NPE in Mistral AI models - if (chatModelProperties.getSupportedCapabilities() != null) { - builder.supportedCapabilities(chatModelProperties.getSupportedCapabilities()); + if (chatModelProperties.supportedCapabilities() != null) { + builder.supportedCapabilities(chatModelProperties.supportedCapabilities()); } return builder.build(); @@ -169,13 +168,13 @@ MistralAiEmbeddingModel mistralAiEmbeddingModel( EmbeddingModelProperties embeddingModelProperties = properties.getEmbeddingModel(); return MistralAiEmbeddingModel.builder() .httpClientBuilder(httpClientBuilder) - .baseUrl(embeddingModelProperties.getBaseUrl()) - .apiKey(embeddingModelProperties.getApiKey()) - .modelName(embeddingModelProperties.getModelName()) - .timeout(embeddingModelProperties.getTimeout()) - .logRequests(embeddingModelProperties.getLogRequests()) - .logResponses(embeddingModelProperties.getLogResponses()) - .maxRetries(embeddingModelProperties.getMaxRetries()) + .baseUrl(embeddingModelProperties.baseUrl()) + .apiKey(embeddingModelProperties.apiKey()) + .modelName(embeddingModelProperties.modelName()) + .timeout(embeddingModelProperties.timeout()) + .logRequests(embeddingModelProperties.logRequests()) + .logResponses(embeddingModelProperties.logResponses()) + .maxRetries(embeddingModelProperties.maxRetries()) .build(); } @@ -197,19 +196,19 @@ MistralAiFimModel mistralAiFimModel( FimModelProperties fimModelProperties = properties.getFimModel(); return MistralAiFimModel.builder() .httpClientBuilder(httpClientBuilder) - .baseUrl(fimModelProperties.getBaseUrl()) - .apiKey(fimModelProperties.getApiKey()) - .modelName(fimModelProperties.getModelName()) - .temperature(fimModelProperties.getTemperature()) - .maxTokens(fimModelProperties.getMaxTokens()) - .minTokens(fimModelProperties.getMinTokens()) - .topP(fimModelProperties.getTopP()) - .randomSeed(fimModelProperties.getRandomSeed()) - .stop(fimModelProperties.getStop()) - .timeout(fimModelProperties.getTimeout()) - .logRequests(fimModelProperties.getLogRequests()) - .logResponses(fimModelProperties.getLogResponses()) - .maxRetries(fimModelProperties.getMaxRetries()) + .baseUrl(fimModelProperties.baseUrl()) + .apiKey(fimModelProperties.apiKey()) + .modelName(fimModelProperties.modelName()) + .temperature(fimModelProperties.temperature()) + .maxTokens(fimModelProperties.maxTokens()) + .minTokens(fimModelProperties.minTokens()) + .topP(fimModelProperties.topP()) + .randomSeed(fimModelProperties.randomSeed()) + .stop(fimModelProperties.stop()) + .timeout(fimModelProperties.timeout()) + .logRequests(fimModelProperties.logRequests()) + .logResponses(fimModelProperties.logResponses()) + .maxRetries(fimModelProperties.maxRetries()) .build(); } @@ -231,18 +230,18 @@ MistralAiStreamingFimModel mistralAiStreamingFimModel( FimModelProperties fimModelProperties = properties.getStreamingFimModel(); return MistralAiStreamingFimModel.builder() .httpClientBuilder(httpClientBuilder) - .baseUrl(fimModelProperties.getBaseUrl()) - .apiKey(fimModelProperties.getApiKey()) - .modelName(fimModelProperties.getModelName()) - .temperature(fimModelProperties.getTemperature()) - .maxTokens(fimModelProperties.getMaxTokens()) - .minTokens(fimModelProperties.getMinTokens()) - .topP(fimModelProperties.getTopP()) - .randomSeed(fimModelProperties.getRandomSeed()) - .stop(fimModelProperties.getStop()) - .timeout(fimModelProperties.getTimeout()) - .logRequests(fimModelProperties.getLogRequests()) - .logResponses(fimModelProperties.getLogResponses()) + .baseUrl(fimModelProperties.baseUrl()) + .apiKey(fimModelProperties.apiKey()) + .modelName(fimModelProperties.modelName()) + .temperature(fimModelProperties.temperature()) + .maxTokens(fimModelProperties.maxTokens()) + .minTokens(fimModelProperties.minTokens()) + .topP(fimModelProperties.topP()) + .randomSeed(fimModelProperties.randomSeed()) + .stop(fimModelProperties.stop()) + .timeout(fimModelProperties.timeout()) + .logRequests(fimModelProperties.logRequests()) + .logResponses(fimModelProperties.logResponses()) .build(); } @@ -288,16 +287,16 @@ MistralAiModerationModel mistralAiModerationModel( ModerationModelProperties moderationModelProperties = properties.getModerationModel(); MistralAiModerationModel.Builder builder = new MistralAiModerationModel.Builder() .httpClientBuilder(httpClientBuilder) - .baseUrl(moderationModelProperties.getBaseUrl()) - .apiKey(moderationModelProperties.getApiKey()) - .modelName(moderationModelProperties.getModelName()) - .timeout(moderationModelProperties.getTimeout()) - .logRequests(moderationModelProperties.getLogRequests()) - .logResponses(moderationModelProperties.getLogResponses()); + .baseUrl(moderationModelProperties.baseUrl()) + .apiKey(moderationModelProperties.apiKey()) + .modelName(moderationModelProperties.modelName()) + .timeout(moderationModelProperties.timeout()) + .logRequests(moderationModelProperties.logRequests()) + .logResponses(moderationModelProperties.logResponses()); // Conditional parameter to avoid NPE in Mistral AI models - if (moderationModelProperties.getMaxRetries() != null) { - builder.maxRetries(moderationModelProperties.getMaxRetries()); + if (moderationModelProperties.maxRetries() != null) { + builder.maxRetries(moderationModelProperties.maxRetries()); } return builder.build(); diff --git a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/ChatModelProperties.java b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/ChatModelProperties.java index 530ec1e3..337103fa 100644 --- a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/ChatModelProperties.java +++ b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/ChatModelProperties.java @@ -2,32 +2,28 @@ import dev.langchain4j.model.chat.Capability; import dev.langchain4j.model.chat.request.ResponseFormat; -import lombok.Getter; -import lombok.Setter; import java.time.Duration; import java.util.List; import java.util.Set; -@Getter -@Setter -class ChatModelProperties { - - String baseUrl; - String apiKey; - String modelName; - Double temperature; - Double topP; - Integer maxTokens; - Boolean safePrompt; - Integer randomSeed; - ResponseFormat responseFormat; - List stopSequences; - Double frequencyPenalty; - Double presencePenalty; - Duration timeout; - Boolean logRequests; - Boolean logResponses; - Integer maxRetries; - Set supportedCapabilities; +public record ChatModelProperties( + String baseUrl, + String apiKey, + String modelName, + Double temperature, + Double topP, + Integer maxTokens, + Boolean safePrompt, + Integer randomSeed, + ResponseFormat responseFormat, + List stopSequences, + Double frequencyPenalty, + Double presencePenalty, + Duration timeout, + Boolean logRequests, + Boolean logResponses, + Integer maxRetries, + Set supportedCapabilities +) { } diff --git a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/EmbeddingModelProperties.java b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/EmbeddingModelProperties.java index e825df92..d71528c2 100644 --- a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/EmbeddingModelProperties.java +++ b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/EmbeddingModelProperties.java @@ -1,19 +1,14 @@ package dev.langchain4j.mistralai.spring; -import lombok.Getter; -import lombok.Setter; - import java.time.Duration; -@Getter -@Setter -class EmbeddingModelProperties { - - String baseUrl; - String apiKey; - String modelName; - Duration timeout; - Boolean logRequests; - Boolean logResponses; - Integer maxRetries; +public record EmbeddingModelProperties( + String baseUrl, + String apiKey, + String modelName, + Duration timeout, + Boolean logRequests, + Boolean logResponses, + Integer maxRetries +) { } diff --git a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/FimModelProperties.java b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/FimModelProperties.java index f655fd72..0c4bd33f 100644 --- a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/FimModelProperties.java +++ b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/FimModelProperties.java @@ -1,26 +1,21 @@ package dev.langchain4j.mistralai.spring; -import lombok.Getter; -import lombok.Setter; - import java.time.Duration; import java.util.List; -@Getter -@Setter -class FimModelProperties { - - String baseUrl; - String apiKey; - String modelName; - Double temperature; - Integer maxTokens; - Integer minTokens; - Double topP; - Integer randomSeed; - List stop; - Duration timeout; - Boolean logRequests; - Boolean logResponses; - Integer maxRetries; +public record FimModelProperties( + String baseUrl, + String apiKey, + String modelName, + Double temperature, + Integer maxTokens, + Integer minTokens, + Double topP, + Integer randomSeed, + List stop, + Duration timeout, + Boolean logRequests, + Boolean logResponses, + Integer maxRetries +) { } diff --git a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/ModerationModelProperties.java b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/ModerationModelProperties.java index d21d1226..f4179d91 100644 --- a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/ModerationModelProperties.java +++ b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/ModerationModelProperties.java @@ -1,19 +1,14 @@ package dev.langchain4j.mistralai.spring; -import lombok.Getter; -import lombok.Setter; - import java.time.Duration; -@Getter -@Setter -class ModerationModelProperties { - - String baseUrl; - String apiKey; - String modelName; - Duration timeout; - Boolean logRequests; - Boolean logResponses; - Integer maxRetries; +public record ModerationModelProperties( + String baseUrl, + String apiKey, + String modelName, + Duration timeout, + Boolean logRequests, + Boolean logResponses, + Integer maxRetries +) { } diff --git a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/Properties.java b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/Properties.java index f4a258c6..45537020 100644 --- a/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/Properties.java +++ b/langchain4j-mistral-ai-spring-boot-starter/src/main/java/dev/langchain4j/mistralai/spring/Properties.java @@ -3,31 +3,75 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.NestedConfigurationProperty; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter @ConfigurationProperties(prefix = Properties.PREFIX) public class Properties { public static final String PREFIX = "langchain4j.mistral-ai"; @NestedConfigurationProperty - ChatModelProperties chatModel; + private ChatModelProperties chatModel; @NestedConfigurationProperty - ChatModelProperties streamingChatModel; + private ChatModelProperties streamingChatModel; @NestedConfigurationProperty - EmbeddingModelProperties embeddingModel; + private EmbeddingModelProperties embeddingModel; @NestedConfigurationProperty - FimModelProperties fimModel; + private FimModelProperties fimModel; @NestedConfigurationProperty - FimModelProperties streamingFimModel; + private FimModelProperties streamingFimModel; @NestedConfigurationProperty - ModerationModelProperties moderationModel; + private ModerationModelProperties moderationModel; + + public ChatModelProperties getChatModel() { + return chatModel; + } + + public void setChatModel(ChatModelProperties chatModel) { + this.chatModel = chatModel; + } + + public ChatModelProperties getStreamingChatModel() { + return streamingChatModel; + } + + public void setStreamingChatModel(ChatModelProperties streamingChatModel) { + this.streamingChatModel = streamingChatModel; + } + + public EmbeddingModelProperties getEmbeddingModel() { + return embeddingModel; + } + + public void setEmbeddingModel(EmbeddingModelProperties embeddingModel) { + this.embeddingModel = embeddingModel; + } + + public FimModelProperties getFimModel() { + return fimModel; + } + + public void setFimModel(FimModelProperties fimModel) { + this.fimModel = fimModel; + } + + public FimModelProperties getStreamingFimModel() { + return streamingFimModel; + } + + public void setStreamingFimModel(FimModelProperties streamingFimModel) { + this.streamingFimModel = streamingFimModel; + } + + public ModerationModelProperties getModerationModel() { + return moderationModel; + } + + public void setModerationModel(ModerationModelProperties moderationModel) { + this.moderationModel = moderationModel; + } + } diff --git a/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/ChatModelProperties.java b/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/ChatModelProperties.java index 725cc2b2..e964344c 100644 --- a/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/ChatModelProperties.java +++ b/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/ChatModelProperties.java @@ -7,7 +7,7 @@ import java.util.Map; import java.util.Set; -class ChatModelProperties { +public class ChatModelProperties { String baseUrl; String modelName; diff --git a/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/EmbeddingModelProperties.java b/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/EmbeddingModelProperties.java index cd1c3087..18c27ff9 100644 --- a/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/EmbeddingModelProperties.java +++ b/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/EmbeddingModelProperties.java @@ -3,7 +3,7 @@ import java.time.Duration; import java.util.Map; -class EmbeddingModelProperties { +public class EmbeddingModelProperties { String baseUrl; String modelName; diff --git a/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/LanguageModelProperties.java b/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/LanguageModelProperties.java index be31a5bf..a31d0bd6 100644 --- a/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/LanguageModelProperties.java +++ b/langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/LanguageModelProperties.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -class LanguageModelProperties { +public class LanguageModelProperties { String baseUrl; String modelName; diff --git a/langchain4j-spring-boot-tests/pom.xml b/langchain4j-spring-boot-tests/pom.xml index 7eca7fed..554ea461 100644 --- a/langchain4j-spring-boot-tests/pom.xml +++ b/langchain4j-spring-boot-tests/pom.xml @@ -53,7 +53,7 @@ org.apache.maven.plugins maven-source-plugin - 3.3.1 + 3.4.0 attach-sources diff --git a/mvnw b/mvnw index 5e9618ca..1ddd97b9 100755 --- a/mvnw +++ b/mvnw @@ -19,7 +19,7 @@ # ---------------------------------------------------------------------------- # ---------------------------------------------------------------------------- -# Apache Maven Wrapper startup batch script, version 3.3.2 +# Apache Maven Wrapper startup batch script, version 3.3.4 # # Required ENV vars: # ------------------ @@ -201,6 +201,14 @@ MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} export MAVEN_PROJECTBASEDIR log "$MAVEN_PROJECTBASEDIR" +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + ########################################################################################## # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central # This allows using the maven wrapper in projects that prohibit checking in binary data. @@ -212,15 +220,13 @@ else log "Couldn't find $wrapperJarPath, downloading it ..." if [ -n "$MVNW_REPOURL" ]; then - wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + wrapperUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" else - wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + wrapperUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" fi while IFS="=" read -r key value; do - # Remove '\r' from value to allow usage on windows as IFS does not consider '\r' as a separator ( considers space, tab, new line ('\n'), and custom '=' ) - safeValue=$(echo "$value" | tr -d '\r') case "$key" in wrapperUrl) - wrapperUrl="$safeValue" + wrapperUrl=$(trim "${value-}") break ;; esac @@ -235,17 +241,17 @@ else log "Found wget ... using wget" [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--quiet" if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - wget $QUIET "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + wget ${QUIET:+"$QUIET"} "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" else - wget $QUIET --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" + wget ${QUIET:+"$QUIET"} --http-user="$MVNW_USERNAME" --http-password="$MVNW_PASSWORD" "$wrapperUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" fi elif command -v curl >/dev/null; then log "Found curl ... using curl" [ "$MVNW_VERBOSE" = true ] && QUIET="" || QUIET="--silent" if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then - curl $QUIET -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + curl ${QUIET:+"$QUIET"} -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" else - curl $QUIET --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" + curl ${QUIET:+"$QUIET"} --user "$MVNW_USERNAME:$MVNW_PASSWORD" -o "$wrapperJarPath" "$wrapperUrl" -f -L || rm -f "$wrapperJarPath" fi else log "Falling back to using Java to download" @@ -276,7 +282,7 @@ fi wrapperSha256Sum="" while IFS="=" read -r key value; do case "$key" in wrapperSha256Sum) - wrapperSha256Sum=$value + wrapperSha256Sum=$(trim "${value-}") break ;; esac @@ -284,7 +290,7 @@ done <"$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.properties" if [ -n "$wrapperSha256Sum" ]; then wrapperSha256Result=false if command -v sha256sum >/dev/null; then - if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c >/dev/null 2>&1; then + if echo "$wrapperSha256Sum $wrapperJarPath" | sha256sum -c - >/dev/null 2>&1; then wrapperSha256Result=true fi elif command -v shasum >/dev/null; then diff --git a/mvnw.cmd b/mvnw.cmd index 1204076a..c453424c 100755 --- a/mvnw.cmd +++ b/mvnw.cmd @@ -18,7 +18,7 @@ @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- -@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM Apache Maven Wrapper startup batch script, version 3.3.4 @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @@ -119,7 +119,7 @@ SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain -set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" +set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B @@ -133,7 +133,7 @@ if exist %WRAPPER_JAR% ( ) ) else ( if not "%MVNW_REPOURL%" == "" ( - SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.2/maven-wrapper-3.3.2.jar" + SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" ) if "%MVNW_VERBOSE%" == "true" ( echo Couldn't find %WRAPPER_JAR%, downloading it ... diff --git a/pom.xml b/pom.xml index eb87790e..8d271f0b 100644 --- a/pom.xml +++ b/pom.xml @@ -40,8 +40,7 @@ 17 17 UTF-8 - 3.3.8 - 1.20.4 + 3.5.9 2.7.0 @@ -66,16 +65,6 @@ import - - - org.testcontainers - testcontainers-bom - ${testcontainers.version} - import - pom - - org.tinylog tinylog-impl @@ -99,13 +88,13 @@ org.apache.maven.plugins maven-surefire-plugin - 3.5.2 + 3.5.4 org.sonatype.central central-publishing-maven-plugin - 0.7.0 + 0.9.0 true central @@ -119,7 +108,7 @@ org.apache.maven.plugins maven-source-plugin - 3.3.1 + 3.4.0 attach-sources @@ -133,7 +122,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.11.1 + 3.12.0 attach-javadocs @@ -147,7 +136,7 @@ org.apache.maven.plugins maven-failsafe-plugin - 3.5.2 + 3.5.4 @@ -161,7 +150,7 @@ io.sundr sundr-maven-plugin - 0.200.0 + 0.230.2 false @@ -194,7 +183,7 @@ org.codehaus.mojo flatten-maven-plugin - 1.7.0 + 1.7.3 ossrh @@ -259,7 +248,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.2.7 + 3.2.8 sign-artifacts