Skip to content

Commit ebd61d8

Browse files
committed
perf(oci-genai): support HTTP client timeout configuration
Signed-off-by: yinh <[email protected]>
1 parent 8c7cb3c commit ebd61d8

File tree

4 files changed

+61
-6
lines changed

4 files changed

+61
-6
lines changed

auto-configurations/models/spring-ai-autoconfigure-model-oci-genai/src/main/java/org/springframework/ai/model/oci/genai/autoconfigure/OCIConnectionProperties.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.ai.model.oci.genai.autoconfigure;
1818

1919
import java.nio.file.Paths;
20+
import java.time.Duration;
2021

2122
import org.springframework.boot.context.properties.ConfigurationProperties;
2223
import org.springframework.util.StringUtils;
@@ -53,6 +54,12 @@ public class OCIConnectionProperties {
5354

5455
private String endpoint;
5556

57+
private Duration connectTimeout;
58+
59+
private Duration readTimeout;
60+
61+
private Integer maxAsyncThreads;
62+
5663
public String getRegion() {
5764
return this.region;
5865
}
@@ -133,6 +140,30 @@ public void setEndpoint(String endpoint) {
133140
this.endpoint = endpoint;
134141
}
135142

143+
public Duration getConnectTimeout() {
144+
return this.connectTimeout;
145+
}
146+
147+
public void setConnectTimeout(Duration connectTimeout) {
148+
this.connectTimeout = connectTimeout;
149+
}
150+
151+
public Duration getReadTimeout() {
152+
return this.readTimeout;
153+
}
154+
155+
public void setReadTimeout(Duration readTimeout) {
156+
this.readTimeout = readTimeout;
157+
}
158+
159+
public Integer getMaxAsyncThreads() {
160+
return this.maxAsyncThreads;
161+
}
162+
163+
public void setMaxAsyncThreads(Integer maxAsyncThreads) {
164+
this.maxAsyncThreads = maxAsyncThreads;
165+
}
166+
136167
public enum AuthenticationType {
137168

138169
FILE("file"), INSTANCE_PRINCIPAL("instance-principal"), WORKLOAD_IDENTITY("workload-identity"),

auto-configurations/models/spring-ai-autoconfigure-model-oci-genai/src/main/java/org/springframework/ai/model/oci/genai/autoconfigure/OCIGenAiInferenceClientAutoConfiguration.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,20 @@ public class OCIGenAiInferenceClientAutoConfiguration {
5252
@ConditionalOnMissingBean
5353
public GenerativeAiInferenceClient generativeAiInferenceClient(OCIConnectionProperties properties)
5454
throws IOException {
55-
ClientConfiguration clientConfiguration = ClientConfiguration.builder()
56-
.retryConfiguration(RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION)
57-
.build();
55+
ClientConfiguration.ClientConfigurationBuilder clientConfigurationBuilder = ClientConfiguration.builder()
56+
.retryConfiguration(RetryConfiguration.SDK_DEFAULT_RETRY_CONFIGURATION);
57+
58+
if (properties.getConnectTimeout() != null) {
59+
clientConfigurationBuilder.connectionTimeoutMillis(properties.getConnectTimeout().toMillisPart());
60+
}
61+
if (properties.getReadTimeout() != null) {
62+
clientConfigurationBuilder.readTimeoutMillis(properties.getReadTimeout().toMillisPart());
63+
}
64+
if (properties.getMaxAsyncThreads() != null) {
65+
clientConfigurationBuilder.maxAsyncThreads(properties.getMaxAsyncThreads());
66+
}
67+
ClientConfiguration clientConfiguration = clientConfigurationBuilder.build();
68+
5869
GenerativeAiInferenceClient.Builder builder = GenerativeAiInferenceClient.builder()
5970
.configuration(clientConfiguration);
6071
if (StringUtils.hasText(properties.getRegion())) {

auto-configurations/models/spring-ai-autoconfigure-model-oci-genai/src/test/java/org/springframework/ai/model/oci/genai/autoconfigure/OCIGenAIAutoConfigurationTest.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.nio.file.Path;
2121
import java.security.KeyPair;
2222
import java.security.KeyPairGenerator;
23+
import java.time.Duration;
2324

2425
import com.oracle.bmc.http.client.pki.Pem;
2526
import org.junit.jupiter.api.Test;
@@ -54,7 +55,11 @@ void setProperties(@TempDir Path tempDir) throws Exception {
5455
"spring.ai.oci.genai.cohere.chat.options.topP=0.8",
5556
"spring.ai.oci.genai.cohere.chat.options.maxTokens=1000",
5657
"spring.ai.oci.genai.cohere.chat.options.frequencyPenalty=0.1",
57-
"spring.ai.oci.genai.cohere.chat.options.presencePenalty=0.2"
58+
"spring.ai.oci.genai.cohere.chat.options.presencePenalty=0.2",
59+
60+
"spring.ai.oci.genai.connect-timeout:1s",
61+
"spring.ai.oci.genai.read-timeout:1s",
62+
"spring.ai.oci.genai.max-async-threads:30"
5863
// @formatter:on
5964
).withConfiguration(SpringAiTestAutoConfigurations.of(OCIGenAiChatAutoConfiguration.class));
6065

@@ -79,6 +84,10 @@ void setProperties(@TempDir Path tempDir) throws Exception {
7984
assertThat(props.getPrivateKey()).isEqualTo(tmp.toAbsolutePath().toString());
8085
assertThat(props.getRegion()).isEqualTo("us-ashburn-1");
8186

87+
assertThat(props.getConnectTimeout()).isEqualTo(Duration.ofSeconds(1));
88+
assertThat(props.getReadTimeout()).isEqualTo(Duration.ofSeconds(1));
89+
assertThat(props.getMaxAsyncThreads()).isEqualTo(30);
90+
8291
});
8392
}
8493

auto-configurations/models/spring-ai-autoconfigure-model-oci-genai/src/test/java/org/springframework/ai/model/oci/genai/autoconfigure/OCIGenAiAutoConfigurationIT.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@ public class OCIGenAiAutoConfigurationIT {
5050
"spring.ai.oci.genai.file=" + this.CONFIG_FILE,
5151
"spring.ai.oci.genai.embedding.compartment=" + this.COMPARTMENT_ID,
5252
"spring.ai.oci.genai.embedding.servingMode=on-demand",
53-
"spring.ai.oci.genai.embedding.model=cohere.embed-english-light-v2.0"
53+
"spring.ai.oci.genai.embedding.model=cohere.embed-english-light-v2.0",
54+
"spring.ai.oci.genai.connect-timeout:1ms",
55+
"spring.ai.oci.genai.read-timeout:1ms"
5456
// @formatter:on
5557
).withConfiguration(SpringAiTestAutoConfigurations.of(OCIGenAiEmbeddingAutoConfiguration.class));
5658

@@ -60,7 +62,9 @@ public class OCIGenAiAutoConfigurationIT {
6062
"spring.ai.oci.genai.file=" + this.CONFIG_FILE,
6163
"spring.ai.oci.genai.cohere.chat.options.compartment=" + this.COMPARTMENT_ID,
6264
"spring.ai.oci.genai.cohere.chat.options.servingMode=on-demand",
63-
"spring.ai.oci.genai.cohere.chat.options.model=" + this.CHAT_MODEL_ID
65+
"spring.ai.oci.genai.cohere.chat.options.model=" + this.CHAT_MODEL_ID,
66+
"spring.ai.oci.genai.connect-timeout:1ms",
67+
"spring.ai.oci.genai.read-timeout:1ms"
6468
// @formatter:on
6569
).withConfiguration(SpringAiTestAutoConfigurations.of(OCIGenAiChatAutoConfiguration.class));
6670

0 commit comments

Comments
 (0)