Skip to content

Commit e2a0508

Browse files
committed
Streamline dependencies and improve API consistency
- Remove unnecessary spring-web dependencies - Update third-party library versions - Refactor API classes to use consistent header handling - Remove ApiUtils class and inline its functionality - Adjust RestClient and WebClient builder usage in autoconfiguration - Replace direct RestClient.Builder injections with ObjectProvider<RestClient.Builder> and WebClient.Builder injections with ObjectProvider<WebClient.Builder> - Update ChromaVectorStoreAutoConfiguration to use ObjectProvider - Rename MongoDbAtlasLocalContainerConnectionDetailsFactoryTest to IT - Switch spring-ai-chroma-store dependency from spring-web to spring-webflux - Simplify ChromaApi constructor by using method reference for default headers Resolves #1066
1 parent f0f3501 commit e2a0508

File tree

35 files changed

+206
-260
lines changed

35 files changed

+206
-260
lines changed

models/spring-ai-bedrock/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,6 @@
2929
<version>${project.parent.version}</version>
3030
</dependency>
3131

32-
<dependency>
33-
<groupId>org.springframework</groupId>
34-
<artifactId>spring-web</artifactId>
35-
<version>${spring-framework.version}</version>
36-
</dependency>
37-
3832
<dependency>
3933
<groupId>org.springframework</groupId>
4034
<artifactId>spring-webflux</artifactId>

models/spring-ai-minimax/src/main/java/org/springframework/ai/minimax/api/MiniMaxApi.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,34 @@
1515
*/
1616
package org.springframework.ai.minimax.api;
1717

18-
import com.fasterxml.jackson.annotation.JsonInclude;
19-
import com.fasterxml.jackson.annotation.JsonInclude.Include;
20-
import com.fasterxml.jackson.annotation.JsonProperty;
21-
import com.fasterxml.jackson.annotation.JsonValue;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.concurrent.atomic.AtomicBoolean;
21+
import java.util.function.Consumer;
22+
import java.util.function.Predicate;
23+
2224
import org.springframework.ai.model.ChatModelDescription;
2325
import org.springframework.ai.model.ModelOptionsUtils;
2426
import org.springframework.ai.retry.RetryUtils;
25-
import org.springframework.ai.util.api.ApiUtils;
2627
import org.springframework.boot.context.properties.bind.ConstructorBinding;
2728
import org.springframework.core.ParameterizedTypeReference;
29+
import org.springframework.http.HttpHeaders;
30+
import org.springframework.http.MediaType;
2831
import org.springframework.http.ResponseEntity;
2932
import org.springframework.util.Assert;
3033
import org.springframework.util.CollectionUtils;
3134
import org.springframework.web.client.ResponseErrorHandler;
3235
import org.springframework.web.client.RestClient;
3336
import org.springframework.web.reactive.function.client.WebClient;
37+
38+
import com.fasterxml.jackson.annotation.JsonInclude;
39+
import com.fasterxml.jackson.annotation.JsonInclude.Include;
40+
import com.fasterxml.jackson.annotation.JsonProperty;
41+
import com.fasterxml.jackson.annotation.JsonValue;
42+
3443
import reactor.core.publisher.Flux;
3544
import reactor.core.publisher.Mono;
3645

37-
import java.util.List;
38-
import java.util.Map;
39-
import java.util.concurrent.atomic.AtomicBoolean;
40-
import java.util.function.Predicate;
41-
4246
// @formatter:off
4347
/**
4448
* Single class implementation of the <a href="https://www.minimaxi.com/document/guides/chat-model/V2">MiniMax Chat Completion API</a> and
@@ -98,15 +102,20 @@ public MiniMaxApi(String baseUrl, String miniMaxToken, RestClient.Builder restCl
98102
*/
99103
public MiniMaxApi(String baseUrl, String miniMaxToken, RestClient.Builder restClientBuilder, ResponseErrorHandler responseErrorHandler) {
100104

105+
Consumer<HttpHeaders> authHeaders = (headers) -> {
106+
headers.setBearerAuth(miniMaxToken);
107+
headers.setContentType(MediaType.APPLICATION_JSON);
108+
};
109+
101110
this.restClient = restClientBuilder
102111
.baseUrl(baseUrl)
103-
.defaultHeaders(ApiUtils.getJsonContentHeaders(miniMaxToken))
112+
.defaultHeaders(authHeaders)
104113
.defaultStatusHandler(responseErrorHandler)
105114
.build();
106115

107116
this.webClient = WebClient.builder()
108117
.baseUrl(baseUrl)
109-
.defaultHeaders(ApiUtils.getJsonContentHeaders(miniMaxToken))
118+
.defaultHeaders(authHeaders)
110119
.build();
111120
}
112121

models/spring-ai-oci-genai/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,12 +41,6 @@
4141
<version>${oci-sdk-version}</version>
4242
</dependency>
4343

44-
<!-- NOTE: Required only by the @ConstructorBinding. -->
45-
<dependency>
46-
<groupId>org.springframework.boot</groupId>
47-
<artifactId>spring-boot</artifactId>
48-
</dependency>
49-
5044
<dependency>
5145
<groupId>org.springframework</groupId>
5246
<artifactId>spring-context-support</artifactId>

models/spring-ai-ollama/pom.xml

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,16 @@
2222

2323
<dependencies>
2424

25-
<dependency>
26-
<groupId>org.springframework.boot</groupId>
27-
<artifactId>spring-boot</artifactId>
28-
</dependency>
29-
3025
<dependency>
3126
<groupId>org.springframework.ai</groupId>
3227
<artifactId>spring-ai-core</artifactId>
3328
<version>${project.parent.version}</version>
3429
</dependency>
3530

3631
<dependency>
37-
<groupId>org.springframework.ai</groupId>
38-
<artifactId>spring-ai-retry</artifactId>
39-
<version>${project.parent.version}</version>
40-
</dependency>
41-
42-
<dependency>
43-
<groupId>org.springframework</groupId>
44-
<artifactId>spring-webflux</artifactId>
32+
<groupId>org.springframework.ai</groupId>
33+
<artifactId>spring-ai-retry</artifactId>
34+
<version>${project.parent.version}</version>
4535
</dependency>
4636

4737
<dependency>

models/spring-ai-openai/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
</scm>
2222

2323
<dependencies>
24-
24+
2525
<!-- production dependencies -->
2626
<dependency>
2727
<groupId>org.springframework.ai</groupId>

models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiApi.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import java.util.List;
1919
import java.util.Map;
2020
import java.util.concurrent.atomic.AtomicBoolean;
21+
import java.util.function.Consumer;
2122
import java.util.function.Predicate;
2223

2324
import org.springframework.ai.model.ChatModelDescription;
@@ -26,6 +27,7 @@
2627
import org.springframework.ai.retry.RetryUtils;
2728
import org.springframework.boot.context.properties.bind.ConstructorBinding;
2829
import org.springframework.core.ParameterizedTypeReference;
30+
import org.springframework.http.HttpHeaders;
2931
import org.springframework.http.MediaType;
3032
import org.springframework.http.ResponseEntity;
3133
import org.springframework.util.Assert;
@@ -154,22 +156,19 @@ public OpenAiApi(String baseUrl, String apiKey, MultiValueMap<String, String> he
154156
this.completionsPath = completionsPath;
155157
this.embeddingsPath = embeddingsPath;
156158
// @formatter:off
159+
Consumer<HttpHeaders> finalHeaders = h -> {
160+
h.setBearerAuth(apiKey);
161+
h.setContentType(MediaType.APPLICATION_JSON);
162+
h.addAll(headers);
163+
};
157164
this.restClient = restClientBuilder.baseUrl(baseUrl)
158-
.defaultHeaders(h -> {
159-
h.setBearerAuth(apiKey);
160-
h.setContentType(MediaType.APPLICATION_JSON);
161-
h.addAll(headers);
162-
})
165+
.defaultHeaders(finalHeaders)
163166
.defaultStatusHandler(responseErrorHandler)
164167
.build();
165168

166169
this.webClient = webClientBuilder
167170
.baseUrl(baseUrl)
168-
.defaultHeaders(h -> {
169-
h.setBearerAuth(apiKey);
170-
h.setContentType(MediaType.APPLICATION_JSON);
171-
h.addAll(headers);
172-
})
171+
.defaultHeaders(finalHeaders)
173172
.build();// @formatter:on
174173
}
175174

models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiAudioApi.java

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,10 @@
1717

1818
import java.util.List;
1919
import java.util.Map;
20-
21-
import com.fasterxml.jackson.annotation.JsonInclude;
22-
import com.fasterxml.jackson.annotation.JsonInclude.Include;
23-
import com.fasterxml.jackson.annotation.JsonProperty;
20+
import java.util.function.Consumer;
2421

2522
import org.springframework.ai.openai.api.common.OpenAiApiConstants;
2623
import org.springframework.ai.retry.RetryUtils;
27-
import org.springframework.ai.util.api.ApiUtils;
2824
import org.springframework.core.io.ByteArrayResource;
2925
import org.springframework.http.HttpHeaders;
3026
import org.springframework.http.MediaType;
@@ -36,6 +32,11 @@
3632
import org.springframework.web.client.ResponseErrorHandler;
3733
import org.springframework.web.client.RestClient;
3834
import org.springframework.web.reactive.function.client.WebClient;
35+
36+
import com.fasterxml.jackson.annotation.JsonInclude;
37+
import com.fasterxml.jackson.annotation.JsonInclude.Include;
38+
import com.fasterxml.jackson.annotation.JsonProperty;
39+
3940
import reactor.core.publisher.Flux;
4041
import reactor.core.publisher.Mono;
4142

@@ -71,13 +72,14 @@ public OpenAiAudioApi(String openAiToken) {
7172
public OpenAiAudioApi(String baseUrl, String openAiToken, RestClient.Builder restClientBuilder,
7273
ResponseErrorHandler responseErrorHandler) {
7374

74-
this.restClient = restClientBuilder.baseUrl(baseUrl).defaultHeaders(headers -> {
75-
headers.setBearerAuth(openAiToken);
76-
}).defaultStatusHandler(responseErrorHandler).build();
75+
Consumer<HttpHeaders> authHeaders = h -> h.setBearerAuth(openAiToken);
7776

78-
this.webClient = WebClient.builder().baseUrl(baseUrl).defaultHeaders(headers -> {
79-
headers.setBearerAuth(openAiToken);
80-
}).defaultHeaders(ApiUtils.getJsonContentHeaders(openAiToken)).build();
77+
this.restClient = restClientBuilder.baseUrl(baseUrl)
78+
.defaultHeaders(authHeaders)
79+
.defaultStatusHandler(responseErrorHandler)
80+
.build();
81+
82+
this.webClient = WebClient.builder().baseUrl(baseUrl).defaultHeaders(authHeaders).build();
8183
}
8284

8385
/**
@@ -108,23 +110,18 @@ public OpenAiAudioApi(String baseUrl, String apiKey, MultiValueMap<String, Strin
108110
RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder,
109111
ResponseErrorHandler responseErrorHandler) {
110112

111-
// @formatter:off
112-
this.restClient = restClientBuilder
113-
.baseUrl(baseUrl)
114-
.defaultHeaders(h -> {
115-
h.setBearerAuth(apiKey);
116-
h.addAll(headers);
117-
})
118-
.defaultStatusHandler(responseErrorHandler).build();
119-
120-
this.webClient = webClientBuilder
121-
.baseUrl(baseUrl)
122-
.defaultHeaders(h -> {
123-
h.setBearerAuth(apiKey);
124-
h.addAll(headers);
125-
})
126-
.defaultHeaders(ApiUtils.getJsonContentHeaders(apiKey)).build();
127-
// @formatter:on
113+
Consumer<HttpHeaders> authHeaders = h -> {
114+
h.setBearerAuth(apiKey);
115+
h.addAll(headers);
116+
// h.setContentType(MediaType.APPLICATION_JSON);
117+
};
118+
119+
this.restClient = restClientBuilder.baseUrl(baseUrl)
120+
.defaultHeaders(authHeaders)
121+
.defaultStatusHandler(responseErrorHandler)
122+
.build();
123+
124+
this.webClient = webClientBuilder.baseUrl(baseUrl).defaultHeaders(authHeaders).build();
128125
}
129126

130127
/**

models/spring-ai-openai/src/main/java/org/springframework/ai/openai/api/OpenAiModerationApi.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,10 @@ public OpenAiModerationApi(String baseUrl, String openAiToken, RestClient.Builde
6161

6262
this.objectMapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
6363

64-
Consumer<HttpHeaders> jsonContentHeaders = headers -> {
65-
headers.setBearerAuth(openAiToken);
66-
headers.setContentType(MediaType.APPLICATION_JSON);
67-
};
68-
69-
this.restClient = restClientBuilder.baseUrl(baseUrl)
70-
.defaultHeaders(jsonContentHeaders)
71-
.defaultStatusHandler(responseErrorHandler)
72-
.build();
64+
this.restClient = restClientBuilder.baseUrl(baseUrl).defaultHeaders(h -> {
65+
h.setBearerAuth(openAiToken);
66+
h.setContentType(MediaType.APPLICATION_JSON);
67+
}).defaultStatusHandler(responseErrorHandler).build();
7368
}
7469

7570
// @formatter:off

models/spring-ai-openai/src/test/java/org/springframework/ai/openai/audio/transcription/OpenAiTranscriptionModelWithTranscriptionResponseMetadataTests.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public class OpenAiTranscriptionModelWithTranscriptionResponseMetadataTests {
5353
private static String TEST_API_KEY = "sk-1234567890";
5454

5555
@Autowired
56-
private OpenAiAudioTranscriptionModel openAiTranscriptionClient;
56+
private OpenAiAudioTranscriptionModel openAiTranscriptionModel;
5757

5858
@Autowired
5959
private MockRestServiceServer server;
@@ -72,7 +72,7 @@ void aiResponseContainsAiMetadata() {
7272

7373
AudioTranscriptionPrompt transcriptionRequest = new AudioTranscriptionPrompt(audioFile);
7474

75-
AudioTranscriptionResponse response = this.openAiTranscriptionClient.call(transcriptionRequest);
75+
AudioTranscriptionResponse response = this.openAiTranscriptionModel.call(transcriptionRequest);
7676

7777
assertThat(response).isNotNull();
7878

models/spring-ai-vertex-ai-embedding/pom.xml

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,6 @@
5858
<version>${project.parent.version}</version>
5959
</dependency>
6060

61-
<dependency>
62-
<groupId>org.springframework</groupId>
63-
<artifactId>spring-web</artifactId>
64-
<version>${spring-framework.version}</version>
65-
</dependency>
66-
67-
6861
<!-- Spring Framework -->
6962
<dependency>
7063
<groupId>org.springframework</groupId>

models/spring-ai-vertex-ai-gemini/pom.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,6 @@
5858
<version>${project.parent.version}</version>
5959
</dependency>
6060

61-
<dependency>
62-
<groupId>org.springframework</groupId>
63-
<artifactId>spring-web</artifactId>
64-
<version>${spring-framework.version}</version>
65-
</dependency>
66-
6761

6862
<!-- Spring Framework -->
6963
<dependency>

models/spring-ai-vertex-ai-palm2/pom.xml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,7 @@
3131

3232
<dependency>
3333
<groupId>org.springframework</groupId>
34-
<artifactId>spring-web</artifactId>
35-
<version>${spring-framework.version}</version>
34+
<artifactId>spring-web</artifactId>
3635
</dependency>
3736

3837

models/spring-ai-watsonx-ai/pom.xml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
<dependencies>
2323

24+
<!-- NOTE: Required only by the @ConstructorBinding. -->
2425
<dependency>
2526
<groupId>org.springframework.boot</groupId>
2627
<artifactId>spring-boot</artifactId>
@@ -38,11 +39,6 @@
3839
<version>${project.parent.version}</version>
3940
</dependency>
4041

41-
<dependency>
42-
<groupId>org.springframework</groupId>
43-
<artifactId>spring-webflux</artifactId>
44-
</dependency>
45-
4642
<dependency>
4743
<groupId>org.springframework.boot</groupId>
4844
<artifactId>spring-boot-starter-logging</artifactId>

models/spring-ai-zhipuai/pom.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
</scm>
2222

2323
<dependencies>
24-
2524
<!-- production dependencies -->
2625
<dependency>
2726
<groupId>org.springframework.ai</groupId>

0 commit comments

Comments
 (0)