Skip to content

Commit 719c239

Browse files
committed
perf(ollama): support HTTP client timeout configuration
Signed-off-by: yinh <[email protected]>
1 parent 6f788b3 commit 719c239

File tree

3 files changed

+53
-4
lines changed

3 files changed

+53
-4
lines changed

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaApiAutoConfiguration.java

Lines changed: 40 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,16 @@
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2525
import org.springframework.boot.context.properties.EnableConfigurationProperties;
26+
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
27+
import org.springframework.boot.http.client.HttpClientSettings;
28+
import org.springframework.boot.http.client.autoconfigure.HttpClientSettingsPropertyMapper;
29+
import org.springframework.boot.http.client.reactive.ClientHttpConnectorBuilder;
2630
import org.springframework.boot.restclient.autoconfigure.RestClientAutoConfiguration;
31+
import org.springframework.boot.ssl.SslBundles;
2732
import org.springframework.boot.webclient.autoconfigure.WebClientAutoConfiguration;
2833
import org.springframework.context.annotation.Bean;
34+
import org.springframework.http.client.ClientHttpRequestFactory;
35+
import org.springframework.http.client.reactive.ClientHttpConnector;
2936
import org.springframework.web.client.ResponseErrorHandler;
3037
import org.springframework.web.client.RestClient;
3138
import org.springframework.web.reactive.function.client.WebClient;
@@ -37,6 +44,7 @@
3744
* @author Eddú Meléndez
3845
* @author Thomas Vitale
3946
* @author Ilayaperumal Gopinathan
47+
* @author yinh
4048
* @since 0.8.0
4149
*/
4250
@AutoConfiguration(after = { RestClientAutoConfiguration.class, WebClientAutoConfiguration.class,
@@ -54,12 +62,29 @@ PropertiesOllamaConnectionDetails ollamaConnectionDetails(OllamaConnectionProper
5462
@Bean
5563
@ConditionalOnMissingBean
5664
public OllamaApi ollamaApi(OllamaConnectionDetails connectionDetails,
65+
OllamaConnectionProperties connectionProperties,
5766
ObjectProvider<RestClient.Builder> restClientBuilderProvider,
58-
ObjectProvider<WebClient.Builder> webClientBuilderProvider, ResponseErrorHandler responseErrorHandler) {
67+
ObjectProvider<WebClient.Builder> webClientBuilderProvider, ResponseErrorHandler responseErrorHandler,
68+
ObjectProvider<SslBundles> sslBundles, ObjectProvider<HttpClientSettings> globalHttpClientSettings,
69+
ObjectProvider<ClientHttpRequestFactoryBuilder<?>> factoryBuilder,
70+
ObjectProvider<ClientHttpConnectorBuilder<?>> webConnectorBuilderProvider) {
71+
72+
HttpClientSettingsPropertyMapper mapper = new HttpClientSettingsPropertyMapper(sslBundles.getIfAvailable(),
73+
globalHttpClientSettings.getIfAvailable());
74+
HttpClientSettings httpClientSettings = mapper.map(connectionProperties);
75+
76+
RestClient.Builder restClientBuilder = restClientBuilderProvider.getIfAvailable(RestClient::builder);
77+
applyRestClientSettings(restClientBuilder, httpClientSettings,
78+
factoryBuilder.getIfAvailable(ClientHttpRequestFactoryBuilder::detect));
79+
80+
WebClient.Builder webClientBuilder = webClientBuilderProvider.getIfAvailable(WebClient::builder);
81+
applyWebClientSettings(webClientBuilder, httpClientSettings,
82+
webConnectorBuilderProvider.getIfAvailable(ClientHttpConnectorBuilder::detect));
83+
5984
return OllamaApi.builder()
6085
.baseUrl(connectionDetails.getBaseUrl())
61-
.restClientBuilder(restClientBuilderProvider.getIfAvailable(RestClient::builder))
62-
.webClientBuilder(webClientBuilderProvider.getIfAvailable(WebClient::builder))
86+
.restClientBuilder(restClientBuilder)
87+
.webClientBuilder(webClientBuilder)
6388
.responseErrorHandler(responseErrorHandler)
6489
.build();
6590
}
@@ -79,4 +104,16 @@ public String getBaseUrl() {
79104

80105
}
81106

107+
private void applyRestClientSettings(RestClient.Builder builder, HttpClientSettings httpClientSettings,
108+
ClientHttpRequestFactoryBuilder<?> factoryBuilder) {
109+
ClientHttpRequestFactory requestFactory = factoryBuilder.build(httpClientSettings);
110+
builder.requestFactory(requestFactory);
111+
}
112+
113+
private void applyWebClientSettings(WebClient.Builder builder, HttpClientSettings httpClientSettings,
114+
ClientHttpConnectorBuilder<?> connectorBuilder) {
115+
ClientHttpConnector connector = connectorBuilder.build(httpClientSettings);
116+
builder.clientConnector(connector);
117+
}
118+
82119
}

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/main/java/org/springframework/ai/model/ollama/autoconfigure/OllamaConnectionProperties.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.ai.model.ollama.autoconfigure;
1818

1919
import org.springframework.boot.context.properties.ConfigurationProperties;
20+
import org.springframework.boot.http.client.autoconfigure.HttpClientSettingsProperties;
2021

2122
/**
2223
* Ollama connection autoconfiguration properties.
@@ -25,7 +26,7 @@
2526
* @since 0.8.0
2627
*/
2728
@ConfigurationProperties(OllamaConnectionProperties.CONFIG_PREFIX)
28-
public class OllamaConnectionProperties {
29+
public class OllamaConnectionProperties extends HttpClientSettingsProperties {
2930

3031
public static final String CONFIG_PREFIX = "spring.ai.ollama";
3132

auto-configurations/models/spring-ai-autoconfigure-model-ollama/src/test/java/org/springframework/ai/model/ollama/autoconfigure/OllamaChatAutoConfigurationIT.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,4 +129,15 @@ void chatActivation() {
129129
});
130130
}
131131

132+
@Test
133+
void chatCompletionWithCustomTimeout() {
134+
this.contextRunner.withPropertyValues("spring.ai.ollama.read-timeout=1ms")
135+
.withPropertyValues("spring.ai.ollama.connect-timeout=1ms")
136+
.run(context -> {
137+
OllamaChatModel chatModel = context.getBean(OllamaChatModel.class);
138+
ChatResponse response = chatModel.call(new Prompt(this.userMessage));
139+
assertThat(response.getResult().getOutput().getText()).contains("Copenhagen");
140+
});
141+
}
142+
132143
}

0 commit comments

Comments
 (0)