Skip to content

Commit f6ce3c7

Browse files
authored
OpenAI: migrate to HttpClient (#113)
## Issue Closes langchain4j/langchain4j#2468 ## Change This PR is a part of langchain4j/langchain4j#2529 ## General checklist - [ ] There are no breaking changes - [x] I have added unit and/or integration tests for my change - [ ] The tests cover both positive and negative cases - [x] I have manually run all the unit and integration tests in the module I have added/changed, and they are all green - [x] I have added/updated the [documentation](https://github.com/langchain4j/langchain4j/tree/main/docs/docs) - [x] I have added an example in the [examples repo](https://github.com/langchain4j/langchain4j-examples) (only for "big" features)
1 parent 59d1fb9 commit f6ce3c7

File tree

14 files changed

+618
-246
lines changed

14 files changed

+618
-246
lines changed

langchain4j-http-client-spring-restclient/src/main/java/dev/langchain4j/http/client/spring/restclient/SpringRestClient.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,10 @@ private static AsyncTaskExecutor createDefaultStreamingRequestExecutor() {
5757
return taskExecutor;
5858
}
5959

60+
public static SpringRestClientBuilder builder() {
61+
return new SpringRestClientBuilder();
62+
}
63+
6064
@Override
6165
public SuccessfulHttpResponse execute(HttpRequest request) throws HttpException {
6266
try {

langchain4j-http-client-spring-restclient/src/main/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientBuilderFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ public class SpringRestClientBuilderFactory implements HttpClientBuilderFactory
66

77
@Override
88
public SpringRestClientBuilder create() {
9-
return new SpringRestClientBuilder();
9+
return SpringRestClient.builder();
1010
}
1111
}

langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientIT.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ class SpringRestClientIT extends HttpClientIT {
1515
@Override
1616
protected List<HttpClient> clients() {
1717
return List.of(
18-
new SpringRestClientBuilder()
18+
SpringRestClient.builder()
1919
.restClientBuilder(RestClient.builder().requestFactory(new JdkClientHttpRequestFactory()))
2020
.build(),
21-
new SpringRestClientBuilder()
21+
SpringRestClient.builder()
2222
.restClientBuilder(RestClient.builder().requestFactory(new HttpComponentsClientHttpRequestFactory()))
2323
.build(),
24-
new SpringRestClientBuilder()
24+
SpringRestClient.builder()
2525
.restClientBuilder(RestClient.builder().requestFactory(new ReactorNettyClientRequestFactory()))
2626
.build(),
27-
new SpringRestClientBuilder()
27+
SpringRestClient.builder()
2828
.restClientBuilder(RestClient.builder().requestFactory(new SimpleClientHttpRequestFactory()))
2929
.build()
3030
);

langchain4j-http-client-spring-restclient/src/test/java/dev/langchain4j/http/client/spring/restclient/SpringRestClientTimeoutIT.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,19 @@ class SpringRestClientTimeoutIT extends HttpClientTimeoutIT {
1818
@Override
1919
protected List<HttpClient> clients(Duration readTimeout) {
2020
return List.of(
21-
new SpringRestClientBuilder()
21+
SpringRestClient.builder()
2222
.restClientBuilder(RestClient.builder().requestFactory(new JdkClientHttpRequestFactory()))
2323
.readTimeout(readTimeout)
2424
.build(),
25-
new SpringRestClientBuilder()
25+
SpringRestClient.builder()
2626
.restClientBuilder(RestClient.builder().requestFactory(new HttpComponentsClientHttpRequestFactory()))
2727
.readTimeout(readTimeout)
2828
.build(),
29-
new SpringRestClientBuilder()
29+
SpringRestClient.builder()
3030
.restClientBuilder(RestClient.builder().requestFactory(new ReactorNettyClientRequestFactory()))
3131
.readTimeout(readTimeout)
3232
.build(),
33-
new SpringRestClientBuilder()
33+
SpringRestClient.builder()
3434
.restClientBuilder(RestClient.builder().requestFactory(new SimpleClientHttpRequestFactory()))
3535
.readTimeout(readTimeout)
3636
.build()

langchain4j-ollama-spring-boot-starter/src/main/java/dev/langchain4j/ollama/spring/AutoConfig.java

Lines changed: 38 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package dev.langchain4j.ollama.spring;
22

33
import dev.langchain4j.http.client.HttpClientBuilder;
4-
import dev.langchain4j.http.client.spring.restclient.SpringRestClientBuilder;
4+
import dev.langchain4j.http.client.spring.restclient.SpringRestClient;
55
import dev.langchain4j.model.chat.listener.ChatModelListener;
66
import dev.langchain4j.model.ollama.*;
77
import org.springframework.beans.factory.ObjectProvider;
@@ -27,22 +27,22 @@ public class AutoConfig {
2727

2828
private static final String TASK_EXECUTOR_THREAD_NAME_PREFIX = "LangChain4j-Ollama-";
2929

30-
private static final String OLLAMA_CHAT_MODEL_HTTP_CLIENT_BUILDER = "ollamaChatModelHttpClientBuilder";
30+
private static final String CHAT_MODEL_HTTP_CLIENT_BUILDER = "ollamaChatModelHttpClientBuilder";
3131

32-
private static final String OLLAMA_STREAMING_CHAT_MODEL_HTTP_CLIENT_BUILDER = "ollamaStreamingChatModelHttpClientBuilder";
33-
private static final String OLLAMA_STREAMING_CHAT_MODEL_TASK_EXECUTOR = "ollamaStreamingChatModelTaskExecutor";
32+
private static final String STREAMING_CHAT_MODEL_HTTP_CLIENT_BUILDER = "ollamaStreamingChatModelHttpClientBuilder";
33+
private static final String STREAMING_CHAT_MODEL_TASK_EXECUTOR = "ollamaStreamingChatModelTaskExecutor";
3434

35-
private static final String OLLAMA_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER = "ollamaLanguageModelHttpClientBuilder";
35+
private static final String LANGUAGE_MODEL_HTTP_CLIENT_BUILDER = "ollamaLanguageModelHttpClientBuilder";
3636

37-
private static final String OLLAMA_STREAMING_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER = "ollamaStreamingLanguageModelHttpClientBuilder";
38-
private static final String OLLAMA_STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR = "ollamaStreamingLanguageModelTaskExecutor";
37+
private static final String STREAMING_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER = "ollamaStreamingLanguageModelHttpClientBuilder";
38+
private static final String STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR = "ollamaStreamingLanguageModelTaskExecutor";
3939

40-
private static final String OLLAMA_EMBEDDING_MODEL_HTTP_CLIENT_BUILDER = "ollamaEmbeddingModelHttpClientBuilder";
40+
private static final String EMBEDDING_MODEL_HTTP_CLIENT_BUILDER = "ollamaEmbeddingModelHttpClientBuilder";
4141

4242
@Bean
4343
@ConditionalOnProperty(PREFIX + ".chat-model.base-url")
4444
OllamaChatModel ollamaChatModel(
45-
@Qualifier(OLLAMA_CHAT_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
45+
@Qualifier(CHAT_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
4646
Properties properties,
4747
ObjectProvider<ChatModelListener> listeners
4848
) {
@@ -69,11 +69,11 @@ OllamaChatModel ollamaChatModel(
6969
.build();
7070
}
7171

72-
@Bean(OLLAMA_CHAT_MODEL_HTTP_CLIENT_BUILDER)
72+
@Bean(CHAT_MODEL_HTTP_CLIENT_BUILDER)
7373
@ConditionalOnProperty(PREFIX + ".chat-model.base-url")
74-
@ConditionalOnMissingBean(name = OLLAMA_CHAT_MODEL_HTTP_CLIENT_BUILDER)
74+
@ConditionalOnMissingBean(name = CHAT_MODEL_HTTP_CLIENT_BUILDER)
7575
HttpClientBuilder ollamaChatModelHttpClientBuilder(ObjectProvider<RestClient.Builder> restClientBuilder) {
76-
return new SpringRestClientBuilder()
76+
return SpringRestClient.builder()
7777
.restClientBuilder(restClientBuilder.getIfAvailable(RestClient::builder))
7878
// executor is not needed for no-streaming OllamaChatModel
7979
.createDefaultStreamingRequestExecutor(false);
@@ -82,7 +82,7 @@ HttpClientBuilder ollamaChatModelHttpClientBuilder(ObjectProvider<RestClient.Bui
8282
@Bean
8383
@ConditionalOnProperty(PREFIX + ".streaming-chat-model.base-url")
8484
OllamaStreamingChatModel ollamaStreamingChatModel(
85-
@Qualifier(OLLAMA_STREAMING_CHAT_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
85+
@Qualifier(STREAMING_CHAT_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
8686
Properties properties,
8787
ObjectProvider<ChatModelListener> listeners
8888
) {
@@ -108,20 +108,20 @@ OllamaStreamingChatModel ollamaStreamingChatModel(
108108
.build();
109109
}
110110

111-
@Bean(OLLAMA_STREAMING_CHAT_MODEL_HTTP_CLIENT_BUILDER)
111+
@Bean(STREAMING_CHAT_MODEL_HTTP_CLIENT_BUILDER)
112112
@ConditionalOnProperty(PREFIX + ".streaming-chat-model.base-url")
113-
@ConditionalOnMissingBean(name = OLLAMA_STREAMING_CHAT_MODEL_HTTP_CLIENT_BUILDER)
113+
@ConditionalOnMissingBean(name = STREAMING_CHAT_MODEL_HTTP_CLIENT_BUILDER)
114114
HttpClientBuilder ollamaStreamingChatModelHttpClientBuilder(
115115
ObjectProvider<RestClient.Builder> restClientBuilder,
116-
@Qualifier(OLLAMA_STREAMING_CHAT_MODEL_TASK_EXECUTOR) AsyncTaskExecutor executor) {
117-
return new SpringRestClientBuilder()
116+
@Qualifier(STREAMING_CHAT_MODEL_TASK_EXECUTOR) AsyncTaskExecutor executor) {
117+
return SpringRestClient.builder()
118118
.restClientBuilder(restClientBuilder.getIfAvailable(RestClient::builder))
119119
.streamingRequestExecutor(executor);
120120
}
121121

122-
@Bean(OLLAMA_STREAMING_CHAT_MODEL_TASK_EXECUTOR)
122+
@Bean(STREAMING_CHAT_MODEL_TASK_EXECUTOR)
123123
@ConditionalOnProperty(PREFIX + ".streaming-chat-model.base-url")
124-
@ConditionalOnMissingBean(name = OLLAMA_STREAMING_CHAT_MODEL_TASK_EXECUTOR)
124+
@ConditionalOnMissingBean(name = STREAMING_CHAT_MODEL_TASK_EXECUTOR)
125125
@ConditionalOnClass(name = "io.micrometer.context.ContextSnapshotFactory")
126126
AsyncTaskExecutor ollamaStreamingChatModelTaskExecutorWithContextPropagation() {
127127
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
@@ -130,9 +130,9 @@ AsyncTaskExecutor ollamaStreamingChatModelTaskExecutorWithContextPropagation() {
130130
return taskExecutor;
131131
}
132132

133-
@Bean(OLLAMA_STREAMING_CHAT_MODEL_TASK_EXECUTOR)
133+
@Bean(STREAMING_CHAT_MODEL_TASK_EXECUTOR)
134134
@ConditionalOnProperty(PREFIX + ".streaming-chat-model.base-url")
135-
@ConditionalOnMissingBean(name = OLLAMA_STREAMING_CHAT_MODEL_TASK_EXECUTOR)
135+
@ConditionalOnMissingBean(name = STREAMING_CHAT_MODEL_TASK_EXECUTOR)
136136
@ConditionalOnMissingClass("io.micrometer.context.ContextSnapshotFactory")
137137
AsyncTaskExecutor ollamaStreamingChatModelTaskExecutor() {
138138
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
@@ -143,7 +143,7 @@ AsyncTaskExecutor ollamaStreamingChatModelTaskExecutor() {
143143
@Bean
144144
@ConditionalOnProperty(PREFIX + ".language-model.base-url")
145145
OllamaLanguageModel ollamaLanguageModel(
146-
@Qualifier(OLLAMA_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
146+
@Qualifier(LANGUAGE_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
147147
Properties properties
148148
) {
149149
LanguageModelProperties languageModelProperties = properties.getLanguageModel();
@@ -167,11 +167,11 @@ OllamaLanguageModel ollamaLanguageModel(
167167
.build();
168168
}
169169

170-
@Bean(OLLAMA_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER)
170+
@Bean(LANGUAGE_MODEL_HTTP_CLIENT_BUILDER)
171171
@ConditionalOnProperty(PREFIX + ".language-model.base-url")
172-
@ConditionalOnMissingBean(name = OLLAMA_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER)
172+
@ConditionalOnMissingBean(name = LANGUAGE_MODEL_HTTP_CLIENT_BUILDER)
173173
HttpClientBuilder ollamaLanguageModelHttpClientBuilder(ObjectProvider<RestClient.Builder> restClientBuilder) {
174-
return new SpringRestClientBuilder()
174+
return SpringRestClient.builder()
175175
.restClientBuilder(restClientBuilder.getIfAvailable(RestClient::builder))
176176
// executor is not needed for no-streaming OllamaLanguageModel
177177
.createDefaultStreamingRequestExecutor(false);
@@ -180,7 +180,7 @@ HttpClientBuilder ollamaLanguageModelHttpClientBuilder(ObjectProvider<RestClient
180180
@Bean
181181
@ConditionalOnProperty(PREFIX + ".streaming-language-model.base-url")
182182
OllamaStreamingLanguageModel ollamaStreamingLanguageModel(
183-
@Qualifier(OLLAMA_STREAMING_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
183+
@Qualifier(STREAMING_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
184184
Properties properties
185185
) {
186186
LanguageModelProperties languageModelProperties = properties.getStreamingLanguageModel();
@@ -203,21 +203,21 @@ OllamaStreamingLanguageModel ollamaStreamingLanguageModel(
203203
.build();
204204
}
205205

206-
@Bean(OLLAMA_STREAMING_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER)
206+
@Bean(STREAMING_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER)
207207
@ConditionalOnProperty(PREFIX + ".streaming-language-model.base-url")
208-
@ConditionalOnMissingBean(name = OLLAMA_STREAMING_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER)
208+
@ConditionalOnMissingBean(name = STREAMING_LANGUAGE_MODEL_HTTP_CLIENT_BUILDER)
209209
HttpClientBuilder ollamaStreamingLanguageModelHttpClientBuilder(
210-
@Qualifier(OLLAMA_STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR) AsyncTaskExecutor executor,
210+
@Qualifier(STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR) AsyncTaskExecutor executor,
211211
ObjectProvider<RestClient.Builder> restClientBuilder
212212
) {
213-
return new SpringRestClientBuilder()
213+
return SpringRestClient.builder()
214214
.restClientBuilder(restClientBuilder.getIfAvailable(RestClient::builder))
215215
.streamingRequestExecutor(executor);
216216
}
217217

218-
@Bean(OLLAMA_STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR)
218+
@Bean(STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR)
219219
@ConditionalOnProperty(PREFIX + ".streaming-language-model.base-url")
220-
@ConditionalOnMissingBean(name = OLLAMA_STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR)
220+
@ConditionalOnMissingBean(name = STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR)
221221
@ConditionalOnClass(name = "io.micrometer.context.ContextSnapshotFactory")
222222
AsyncTaskExecutor ollamaStreamingLanguageModelTaskExecutorWithContextPropagation() {
223223
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
@@ -226,9 +226,9 @@ AsyncTaskExecutor ollamaStreamingLanguageModelTaskExecutorWithContextPropagation
226226
return taskExecutor;
227227
}
228228

229-
@Bean(OLLAMA_STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR)
229+
@Bean(STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR)
230230
@ConditionalOnProperty(PREFIX + ".streaming-language-model.base-url")
231-
@ConditionalOnMissingBean(name = OLLAMA_STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR)
231+
@ConditionalOnMissingBean(name = STREAMING_LANGUAGE_MODEL_TASK_EXECUTOR)
232232
@ConditionalOnMissingClass("io.micrometer.context.ContextSnapshotFactory")
233233
AsyncTaskExecutor ollamaStreamingLanguageModelTaskExecutor() {
234234
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
@@ -239,7 +239,7 @@ AsyncTaskExecutor ollamaStreamingLanguageModelTaskExecutor() {
239239
@Bean
240240
@ConditionalOnProperty(PREFIX + ".embedding-model.base-url")
241241
OllamaEmbeddingModel ollamaEmbeddingModel(
242-
@Qualifier(OLLAMA_EMBEDDING_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
242+
@Qualifier(EMBEDDING_MODEL_HTTP_CLIENT_BUILDER) HttpClientBuilder httpClientBuilder,
243243
Properties properties
244244
) {
245245
EmbeddingModelProperties embeddingModelProperties = properties.getEmbeddingModel();
@@ -255,11 +255,11 @@ OllamaEmbeddingModel ollamaEmbeddingModel(
255255
.build();
256256
}
257257

258-
@Bean(OLLAMA_EMBEDDING_MODEL_HTTP_CLIENT_BUILDER)
258+
@Bean(EMBEDDING_MODEL_HTTP_CLIENT_BUILDER)
259259
@ConditionalOnProperty(PREFIX + ".embedding-model.base-url")
260-
@ConditionalOnMissingBean(name = OLLAMA_EMBEDDING_MODEL_HTTP_CLIENT_BUILDER)
260+
@ConditionalOnMissingBean(name = EMBEDDING_MODEL_HTTP_CLIENT_BUILDER)
261261
HttpClientBuilder ollamaEmbeddingModelHttpClientBuilder(ObjectProvider<RestClient.Builder> restClientBuilder) {
262-
return new SpringRestClientBuilder()
262+
return SpringRestClient.builder()
263263
.restClientBuilder(restClientBuilder.getIfAvailable(RestClient::builder))
264264
// executor is not needed for no-streaming OllamaEmbeddingModel
265265
.createDefaultStreamingRequestExecutor(false);

langchain4j-open-ai-spring-boot-starter/pom.xml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,18 @@
1919
<dependency>
2020
<groupId>dev.langchain4j</groupId>
2121
<artifactId>langchain4j-open-ai</artifactId>
22+
<exclusions>
23+
<exclusion>
24+
<groupId>dev.langchain4j</groupId>
25+
<artifactId>langchain4j-http-client-jdk</artifactId>
26+
</exclusion>
27+
</exclusions>
28+
</dependency>
29+
30+
<dependency>
31+
<groupId>dev.langchain4j</groupId>
32+
<artifactId>langchain4j-http-client-spring-restclient</artifactId>
33+
<version>${project.version}</version>
2234
</dependency>
2335

2436
<dependency>

0 commit comments

Comments
 (0)