Skip to content

Commit 182a2c4

Browse files
committed
perf(miniMax): support HTTP client timeout configuration
Signed-off-by: yinh <fottas@163.com>
1 parent 109c099 commit 182a2c4

File tree

5 files changed

+88
-9
lines changed

5 files changed

+88
-9
lines changed

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxChatAutoConfiguration.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,14 @@
3434
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3535
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3636
import org.springframework.boot.context.properties.EnableConfigurationProperties;
37+
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
38+
import org.springframework.boot.http.client.HttpClientSettings;
39+
import org.springframework.boot.http.client.autoconfigure.HttpClientSettingsPropertyMapper;
3740
import org.springframework.boot.restclient.autoconfigure.RestClientAutoConfiguration;
41+
import org.springframework.boot.ssl.SslBundles;
3842
import org.springframework.context.annotation.Bean;
3943
import org.springframework.core.retry.RetryTemplate;
44+
import org.springframework.http.client.ClientHttpRequestFactory;
4045
import org.springframework.util.Assert;
4146
import org.springframework.util.StringUtils;
4247
import org.springframework.web.client.ResponseErrorHandler;
@@ -48,6 +53,7 @@
4853
* @author Geng Rong
4954
* @author Ilayaperumal Gopinathan
5055
* @author Issam El-atif
56+
* @author yinh
5157
*/
5258
@AutoConfiguration(after = { RestClientAutoConfiguration.class, SpringAiRetryAutoConfiguration.class,
5359
ToolCallingAutoConfiguration.class })
@@ -64,11 +70,20 @@ public MiniMaxChatModel miniMaxChatModel(MiniMaxConnectionProperties commonPrope
6470
ToolCallingManager toolCallingManager, RetryTemplate retryTemplate,
6571
ResponseErrorHandler responseErrorHandler, ObjectProvider<ObservationRegistry> observationRegistry,
6672
ObjectProvider<ChatModelObservationConvention> observationConvention,
67-
ObjectProvider<ToolExecutionEligibilityPredicate> openAiToolExecutionEligibilityPredicate) {
73+
ObjectProvider<ToolExecutionEligibilityPredicate> openAiToolExecutionEligibilityPredicate,
74+
ObjectProvider<SslBundles> sslBundles, ObjectProvider<HttpClientSettings> globalHttpClientSettings,
75+
ObjectProvider<ClientHttpRequestFactoryBuilder<?>> factoryBuilder) {
76+
77+
HttpClientSettingsPropertyMapper mapper = new HttpClientSettingsPropertyMapper(sslBundles.getIfAvailable(),
78+
globalHttpClientSettings.getIfAvailable());
79+
HttpClientSettings httpClientSettings = mapper.map(commonProperties);
80+
81+
RestClient.Builder restClientBuilder = restClientBuilderProvider.getIfAvailable(RestClient::builder);
82+
applyRestClientSettings(restClientBuilder, httpClientSettings,
83+
factoryBuilder.getIfAvailable(ClientHttpRequestFactoryBuilder::detect));
6884

6985
var miniMaxApi = miniMaxApi(chatProperties.getBaseUrl(), commonProperties.getBaseUrl(),
70-
chatProperties.getApiKey(), commonProperties.getApiKey(),
71-
restClientBuilderProvider.getIfAvailable(RestClient::builder), responseErrorHandler);
86+
chatProperties.getApiKey(), commonProperties.getApiKey(), restClientBuilder, responseErrorHandler);
7287

7388
var chatModel = new MiniMaxChatModel(miniMaxApi, chatProperties.getOptions(), toolCallingManager, retryTemplate,
7489
observationRegistry.getIfUnique(() -> ObservationRegistry.NOOP),
@@ -90,4 +105,10 @@ private MiniMaxApi miniMaxApi(String baseUrl, String commonBaseUrl, String apiKe
90105
return new MiniMaxApi(resolvedBaseUrl, resolvedApiKey, restClientBuilder, responseErrorHandler);
91106
}
92107

108+
private void applyRestClientSettings(RestClient.Builder builder, HttpClientSettings httpClientSettings,
109+
ClientHttpRequestFactoryBuilder<?> factoryBuilder) {
110+
ClientHttpRequestFactory requestFactory = factoryBuilder.build(httpClientSettings);
111+
builder.requestFactory(requestFactory);
112+
}
113+
93114
}

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxConnectionProperties.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,31 @@
1717
package org.springframework.ai.model.minimax.autoconfigure;
1818

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

2122
@ConfigurationProperties(MiniMaxConnectionProperties.CONFIG_PREFIX)
22-
public class MiniMaxConnectionProperties extends MiniMaxParentProperties {
23+
public class MiniMaxConnectionProperties extends HttpClientSettingsProperties {
2324

2425
public static final String CONFIG_PREFIX = "spring.ai.minimax";
2526

26-
public static final String DEFAULT_BASE_URL = "https://api.minimax.chat";
27+
private String apiKey;
2728

28-
public MiniMaxConnectionProperties() {
29-
super.setBaseUrl(DEFAULT_BASE_URL);
29+
private String baseUrl = "https://api.minimax.chat";
30+
31+
public String getApiKey() {
32+
return this.apiKey;
33+
}
34+
35+
public void setApiKey(String apiKey) {
36+
this.apiKey = apiKey;
37+
}
38+
39+
public String getBaseUrl() {
40+
return this.baseUrl;
41+
}
42+
43+
public void setBaseUrl(String baseUrl) {
44+
this.baseUrl = baseUrl;
3045
}
3146

3247
}

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/main/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxEmbeddingAutoConfiguration.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,15 @@
3030
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3131
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3232
import org.springframework.boot.context.properties.EnableConfigurationProperties;
33+
import org.springframework.boot.http.client.ClientHttpRequestFactoryBuilder;
34+
import org.springframework.boot.http.client.HttpClientSettings;
35+
import org.springframework.boot.http.client.autoconfigure.HttpClientSettingsPropertyMapper;
36+
import org.springframework.boot.restclient.RestClientCustomizer;
3337
import org.springframework.boot.restclient.autoconfigure.RestClientAutoConfiguration;
38+
import org.springframework.boot.ssl.SslBundles;
3439
import org.springframework.context.annotation.Bean;
3540
import org.springframework.core.retry.RetryTemplate;
41+
import org.springframework.http.client.ClientHttpRequestFactory;
3642
import org.springframework.util.Assert;
3743
import org.springframework.util.StringUtils;
3844
import org.springframework.web.client.ResponseErrorHandler;
@@ -57,7 +63,17 @@ public MiniMaxEmbeddingModel miniMaxEmbeddingModel(MiniMaxConnectionProperties c
5763
MiniMaxEmbeddingProperties embeddingProperties,
5864
ObjectProvider<RestClient.Builder> restClientBuilderProvider, RetryTemplate retryTemplate,
5965
ResponseErrorHandler responseErrorHandler, ObjectProvider<ObservationRegistry> observationRegistry,
60-
ObjectProvider<EmbeddingModelObservationConvention> observationConvention) {
66+
ObjectProvider<EmbeddingModelObservationConvention> observationConvention,
67+
ObjectProvider<SslBundles> sslBundles, ObjectProvider<HttpClientSettings> globalHttpClientSettings,
68+
ObjectProvider<ClientHttpRequestFactoryBuilder<?>> factoryBuilder) {
69+
70+
HttpClientSettingsPropertyMapper mapper = new HttpClientSettingsPropertyMapper(sslBundles.getIfAvailable(),
71+
globalHttpClientSettings.getIfAvailable());
72+
HttpClientSettings httpClientSettings = mapper.map(commonProperties);
73+
74+
RestClient.Builder restClientBuilder = restClientBuilderProvider.getIfAvailable(RestClient::builder);
75+
applyRestClientSettings(restClientBuilder, httpClientSettings,
76+
factoryBuilder.getIfAvailable(ClientHttpRequestFactoryBuilder::detect));
6177

6278
var miniMaxApi = miniMaxApi(embeddingProperties.getBaseUrl(), commonProperties.getBaseUrl(),
6379
embeddingProperties.getApiKey(), commonProperties.getApiKey(),
@@ -84,4 +100,10 @@ private MiniMaxApi miniMaxApi(String baseUrl, String commonBaseUrl, String apiKe
84100
return new MiniMaxApi(resolvedBaseUrl, resolvedApiKey, restClientBuilder, responseErrorHandler);
85101
}
86102

103+
private void applyRestClientSettings(RestClient.Builder builder, HttpClientSettings httpClientSettings,
104+
ClientHttpRequestFactoryBuilder<?> factoryBuilder) {
105+
ClientHttpRequestFactory requestFactory = factoryBuilder.build(httpClientSettings);
106+
builder.requestFactory(requestFactory);
107+
}
108+
87109
}

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxAutoConfigurationIT.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,18 @@ void embedding() {
9494
});
9595
}
9696

97+
@Test
98+
void generateWithCustomTimeout() {
99+
this.contextRunner.withConfiguration(SpringAiTestAutoConfigurations.of(MiniMaxChatAutoConfiguration.class))
100+
.withPropertyValues("spring.ai.minimax.connect-timeout=1s", "spring.ai.minimax.read-timeout=1s")
101+
.run(context -> {
102+
MiniMaxChatModel chatModel = context.getBean(MiniMaxChatModel.class);
103+
104+
String response = chatModel.call("Hello");
105+
assertThat(response).isNotNull();
106+
107+
logger.info("Response with custom timeout: " + response);
108+
});
109+
}
110+
97111
}

auto-configurations/models/spring-ai-autoconfigure-model-minimax/src/test/java/org/springframework/ai/model/minimax/autoconfigure/MiniMaxPropertiesTests.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.ai.model.minimax.autoconfigure;
1818

19+
import java.time.Duration;
20+
1921
import org.junit.jupiter.api.Test;
2022
import org.skyscreamer.jsonassert.JSONAssert;
2123
import org.skyscreamer.jsonassert.JSONCompareMode;
@@ -74,7 +76,9 @@ public void chatOverrideConnectionProperties() {
7476
"spring.ai.minimax.chat.base-url=TEST_BASE_URL2",
7577
"spring.ai.minimax.chat.api-key=456",
7678
"spring.ai.minimax.chat.options.model=MODEL_XYZ",
77-
"spring.ai.minimax.chat.options.temperature=0.55")
79+
"spring.ai.minimax.chat.options.temperature=0.55",
80+
"spring.ai.elevenlabs.connect-timeout=1s",
81+
"spring.ai.elevenlabs.read-timeout=1s")
7882
// @formatter:on
7983
.withConfiguration(SpringAiTestAutoConfigurations.of(MiniMaxChatAutoConfiguration.class))
8084
.run(context -> {
@@ -89,6 +93,9 @@ public void chatOverrideConnectionProperties() {
8993

9094
assertThat(chatProperties.getOptions().getModel()).isEqualTo("MODEL_XYZ");
9195
assertThat(chatProperties.getOptions().getTemperature()).isEqualTo(0.55);
96+
97+
assertThat(connectionProperties.getConnectTimeout()).isEqualTo(Duration.ofSeconds(1));
98+
assertThat(connectionProperties.getReadTimeout()).isEqualTo(Duration.ofSeconds(1));
9299
});
93100
}
94101

0 commit comments

Comments
 (0)