Skip to content

Commit 7b58f42

Browse files
makingtzolov
authored andcommitted
Use pre-configured RestClient.Builder by Spring Boot
- Add annotation dependency on RestClientAutoConfiguration
1 parent 577a605 commit 7b58f42

File tree

11 files changed

+55
-36
lines changed

11 files changed

+55
-36
lines changed

spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/ollama/OllamaAutoConfiguration.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,19 @@
2222
import org.springframework.boot.autoconfigure.AutoConfiguration;
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
25+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2526
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2627
import org.springframework.context.annotation.Bean;
2728
import org.springframework.context.annotation.ImportRuntimeHints;
29+
import org.springframework.web.client.RestClient;
2830

2931
/**
3032
* {@link AutoConfiguration Auto-configuration} for Ollama Chat Client.
3133
*
3234
* @author Christian Tzolov
3335
* @since 0.8.0
3436
*/
35-
@AutoConfiguration
37+
@AutoConfiguration(after = RestClientAutoConfiguration.class)
3638
@ConditionalOnClass(OllamaApi.class)
3739
@EnableConfigurationProperties({ OllamaChatProperties.class, OllamaEmbeddingProperties.class,
3840
OllamaConnectionProperties.class })
@@ -41,8 +43,8 @@ public class OllamaAutoConfiguration {
4143

4244
@Bean
4345
@ConditionalOnMissingBean
44-
public OllamaApi ollamaApi(OllamaConnectionProperties properties) {
45-
return new OllamaApi(properties.getBaseUrl());
46+
public OllamaApi ollamaApi(OllamaConnectionProperties properties, RestClient.Builder restClientBuilder) {
47+
return new OllamaApi(properties.getBaseUrl(), restClientBuilder);
4648
}
4749

4850
@Bean

spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfiguration.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,15 @@
2626
import org.springframework.boot.autoconfigure.AutoConfiguration;
2727
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2828
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
29+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2930
import org.springframework.boot.context.properties.EnableConfigurationProperties;
3031
import org.springframework.context.annotation.Bean;
3132
import org.springframework.context.annotation.ImportRuntimeHints;
3233
import org.springframework.util.Assert;
3334
import org.springframework.util.StringUtils;
3435
import org.springframework.web.client.RestClient;
3536

36-
@AutoConfiguration
37+
@AutoConfiguration(after = RestClientAutoConfiguration.class)
3738
@ConditionalOnClass(OpenAiApi.class)
3839
@EnableConfigurationProperties({ OpenAiConnectionProperties.class, OpenAiChatProperties.class,
3940
OpenAiEmbeddingProperties.class, OpenAiImageProperties.class })
@@ -46,7 +47,7 @@ public class OpenAiAutoConfiguration {
4647
@Bean
4748
@ConditionalOnMissingBean
4849
public OpenAiChatClient openAiChatClient(OpenAiConnectionProperties commonProperties,
49-
OpenAiChatProperties chatProperties) {
50+
OpenAiChatProperties chatProperties, RestClient.Builder restClientBuilder) {
5051

5152
String apiKey = StringUtils.hasText(chatProperties.getApiKey()) ? chatProperties.getApiKey()
5253
: commonProperties.getApiKey();
@@ -57,7 +58,7 @@ public OpenAiChatClient openAiChatClient(OpenAiConnectionProperties commonProper
5758
Assert.hasText(apiKey, "OpenAI API key must be set");
5859
Assert.hasText(baseUrl, "OpenAI base URL must be set");
5960

60-
var openAiApi = new OpenAiApi(baseUrl, apiKey, RestClient.builder());
61+
var openAiApi = new OpenAiApi(baseUrl, apiKey, restClientBuilder);
6162

6263
OpenAiChatClient openAiChatClient = new OpenAiChatClient(openAiApi)
6364
.withDefaultOptions(chatProperties.getOptions());
@@ -68,7 +69,7 @@ public OpenAiChatClient openAiChatClient(OpenAiConnectionProperties commonProper
6869
@Bean
6970
@ConditionalOnMissingBean
7071
public EmbeddingClient openAiEmbeddingClient(OpenAiConnectionProperties commonProperties,
71-
OpenAiEmbeddingProperties embeddingProperties) {
72+
OpenAiEmbeddingProperties embeddingProperties, RestClient.Builder restClientBuilder) {
7273

7374
String apiKey = StringUtils.hasText(embeddingProperties.getApiKey()) ? embeddingProperties.getApiKey()
7475
: commonProperties.getApiKey();
@@ -78,15 +79,15 @@ public EmbeddingClient openAiEmbeddingClient(OpenAiConnectionProperties commonPr
7879
Assert.hasText(apiKey, "OpenAI API key must be set");
7980
Assert.hasText(baseUrl, "OpenAI base URL must be set");
8081

81-
var openAiApi = new OpenAiApi(baseUrl, apiKey, RestClient.builder());
82+
var openAiApi = new OpenAiApi(baseUrl, apiKey, restClientBuilder);
8283

8384
return new OpenAiEmbeddingClient(openAiApi).withDefaultOptions(embeddingProperties.getOptions());
8485
}
8586

8687
@Bean
8788
@ConditionalOnMissingBean
8889
public OpenAiImageClient openAiImageClient(OpenAiConnectionProperties commonProperties,
89-
OpenAiImageProperties imageProperties) {
90+
OpenAiImageProperties imageProperties, RestClient.Builder restClientBuilder) {
9091
String apiKey = StringUtils.hasText(imageProperties.getApiKey()) ? imageProperties.getApiKey()
9192
: commonProperties.getApiKey();
9293

@@ -96,7 +97,7 @@ public OpenAiImageClient openAiImageClient(OpenAiConnectionProperties commonProp
9697
Assert.hasText(apiKey, "OpenAI API key must be set");
9798
Assert.hasText(baseUrl, "OpenAI base URL must be set");
9899

99-
var openAiImageApi = new OpenAiImageApi(baseUrl, apiKey, RestClient.builder());
100+
var openAiImageApi = new OpenAiImageApi(baseUrl, apiKey, restClientBuilder);
100101

101102
return new OpenAiImageClient(openAiImageApi).withDefaultOptions(imageProperties.getOptions());
102103
}

spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/stabilityai/StabilityAiImageAutoConfiguration.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,28 @@
2121
import org.springframework.boot.autoconfigure.AutoConfiguration;
2222
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
24+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2425
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2526
import org.springframework.context.annotation.Bean;
2627
import org.springframework.context.annotation.ImportRuntimeHints;
28+
import org.springframework.web.client.RestClient;
2729

2830
/**
2931
* @author Mark Pollack
3032
* @since 0.8.0
3133
*/
32-
@AutoConfiguration
34+
@AutoConfiguration(after = RestClientAutoConfiguration.class)
3335
@ConditionalOnClass(StabilityAiApi.class)
3436
@EnableConfigurationProperties({ StabilityAiProperties.class })
3537
@ImportRuntimeHints(NativeHints.class)
3638
public class StabilityAiImageAutoConfiguration {
3739

3840
@Bean
3941
@ConditionalOnMissingBean
40-
public StabilityAiApi stabilityAiApi(StabilityAiProperties stabilityAiProperties) {
42+
public StabilityAiApi stabilityAiApi(StabilityAiProperties stabilityAiProperties,
43+
RestClient.Builder restClientBuilder) {
4144
return new StabilityAiApi(stabilityAiProperties.getApiKey(), stabilityAiProperties.getBaseUrl(),
42-
stabilityAiProperties.getOptions().getModel());
45+
stabilityAiProperties.getOptions().getModel(), restClientBuilder);
4346
}
4447

4548
@Bean

spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/vertexai/VertexAiAutoConfiguration.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@
2323
import org.springframework.boot.autoconfigure.AutoConfiguration;
2424
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2525
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
26+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2627
import org.springframework.boot.context.properties.EnableConfigurationProperties;
2728
import org.springframework.context.annotation.Bean;
2829
import org.springframework.context.annotation.ImportRuntimeHints;
2930
import org.springframework.web.client.RestClient;
3031

31-
@AutoConfiguration
32+
@AutoConfiguration(after = RestClientAutoConfiguration.class)
3233
@ConditionalOnClass(VertexAiApi.class)
3334
@ImportRuntimeHints(NativeHints.class)
3435
@EnableConfigurationProperties({ VertexAiConnectionProperties.class, VertexAiChatProperties.class,
@@ -56,10 +57,11 @@ public VertexAiEmbeddingClient vertexAiEmbeddingClient(VertexAiApi vertexAiApi)
5657
@Bean
5758
@ConditionalOnMissingBean
5859
public VertexAiApi vertexAiApi(VertexAiConnectionProperties connectionProperties,
59-
VertexAiEmbeddingProperties embeddingAiProperties, VertexAiChatProperties chatProperties) {
60+
VertexAiEmbeddingProperties embeddingAiProperties, VertexAiChatProperties chatProperties,
61+
RestClient.Builder restClientBuilder) {
6062

6163
return new VertexAiApi(connectionProperties.getBaseUrl(), connectionProperties.getApiKey(),
62-
chatProperties.getModel(), embeddingAiProperties.getModel(), RestClient.builder());
64+
chatProperties.getModel(), embeddingAiProperties.getModel(), restClientBuilder);
6365
}
6466

6567
}

spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/OllamaAutoConfigurationIT.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.springframework.ai.chat.messages.Message;
3131
import org.springframework.ai.chat.messages.UserMessage;
3232
import org.springframework.boot.autoconfigure.AutoConfigurations;
33+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
3334
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3435
import org.testcontainers.containers.GenericContainer;
3536
import org.testcontainers.junit.jupiter.Container;
@@ -71,13 +72,12 @@ public static void beforeAll() throws IOException, InterruptedException {
7172

7273
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner().withPropertyValues(
7374
// @formatter:off
74-
"spring.ai.ollama.chat.enabled=true",
75-
"spring.ai.ollama.chat.options.model=" + MODEL_NAME,
7675
"spring.ai.ollama.baseUrl=" + baseUrl,
76+
"spring.ai.ollama.chat.options.model=" + MODEL_NAME,
7777
"spring.ai.ollama.chat.options.temperature=0.5",
7878
"spring.ai.ollama.chat.options.topK=10")
7979
// @formatter:on
80-
.withConfiguration(AutoConfigurations.of(OllamaAutoConfiguration.class));
80+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OllamaAutoConfiguration.class));
8181

8282
private final Message systemMessage = new SystemPromptTemplate("""
8383
You are a helpful AI assistant. Your name is {name}.

spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/OllamaAutoConfigurationTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.junit.jupiter.api.Test;
2020

2121
import org.springframework.boot.autoconfigure.AutoConfigurations;
22+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2223
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2324

2425
import static org.assertj.core.api.Assertions.assertThat;
@@ -40,7 +41,7 @@ public void propertiesTest() {
4041
"spring.ai.ollama.chat.options.topP=0.56",
4142
"spring.ai.ollama.chat.options.topK=123")
4243
// @formatter:on
43-
.withConfiguration(AutoConfigurations.of(OllamaAutoConfiguration.class))
44+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OllamaAutoConfiguration.class))
4445
.run(context -> {
4546
var chatProperties = context.getBean(OllamaChatProperties.class);
4647
var connectionProperties = context.getBean(OllamaConnectionProperties.class);

spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/OllamaEmbeddingAutoConfigurationIT.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.ai.embedding.EmbeddingResponse;
2525
import org.springframework.ai.ollama.OllamaEmbeddingClient;
2626
import org.springframework.boot.autoconfigure.AutoConfigurations;
27+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2728
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2829
import org.testcontainers.containers.GenericContainer;
2930
import org.testcontainers.junit.jupiter.Container;
@@ -63,7 +64,7 @@ public static void beforeAll() throws IOException, InterruptedException {
6364
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
6465
.withPropertyValues("spring.ai.ollama.embedding.options.model=" + MODEL_NAME,
6566
"spring.ai.ollama.base-url=" + baseUrl)
66-
.withConfiguration(AutoConfigurations.of(OllamaAutoConfiguration.class));
67+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OllamaAutoConfiguration.class));
6768

6869
@Test
6970
public void singleTextEmbedding() {

spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/ollama/OllamaEmbeddingAutoConfigurationTests.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.junit.jupiter.api.Test;
2020

2121
import org.springframework.boot.autoconfigure.AutoConfigurations;
22+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2223
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2324

2425
import static org.assertj.core.api.Assertions.assertThat;
@@ -32,10 +33,15 @@ public class OllamaEmbeddingAutoConfigurationTests {
3233
@Test
3334
public void propertiesTest() {
3435

35-
new ApplicationContextRunner()
36-
.withPropertyValues("spring.ai.ollama.base-url=TEST_BASE_URL", "spring.ai.ollama.embedding.model=MODEL_XYZ",
37-
"spring.ai.ollama.embedding.options.temperature=0.13", "spring.ai.ollama.embedding.options.topK=13")
38-
.withConfiguration(AutoConfigurations.of(OllamaAutoConfiguration.class))
36+
new ApplicationContextRunner().withPropertyValues(
37+
// @formatter:off
38+
"spring.ai.ollama.base-url=TEST_BASE_URL",
39+
"spring.ai.ollama.embedding.options.model=MODEL_XYZ",
40+
"spring.ai.ollama.embedding.options.temperature=0.13",
41+
"spring.ai.ollama.embedding.options.topK=13"
42+
// @formatter:on
43+
)
44+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OllamaAutoConfiguration.class))
3945
.run(context -> {
4046
var embeddingProperties = context.getBean(OllamaEmbeddingProperties.class);
4147
var connectionProperties = context.getBean(OllamaConnectionProperties.class);

spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiAutoConfigurationIT.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.springframework.ai.openai.OpenAiChatClient;
3636
import org.springframework.ai.openai.OpenAiEmbeddingClient;
3737
import org.springframework.boot.autoconfigure.AutoConfigurations;
38+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
3839
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3940

4041
import static org.assertj.core.api.Assertions.assertThat;
@@ -46,7 +47,7 @@ public class OpenAiAutoConfigurationIT {
4647

4748
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4849
.withPropertyValues("spring.ai.openai.apiKey=" + System.getenv("OPENAI_API_KEY"))
49-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class));
50+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class));
5051

5152
@Test
5253
void generate() {

spring-ai-spring-boot-autoconfigure/src/test/java/org/springframework/ai/autoconfigure/openai/OpenAiPropertiesTests.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.springframework.ai.openai.api.OpenAiApi.ChatCompletionRequest.ToolChoice;
2525
import org.springframework.ai.openai.api.OpenAiApi.FunctionTool.Type;
2626
import org.springframework.boot.autoconfigure.AutoConfigurations;
27+
import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration;
2728
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2829

2930
import static org.assertj.core.api.Assertions.assertThat;
@@ -48,7 +49,7 @@ public void chatProperties() {
4849
"spring.ai.openai.chat.options.model=MODEL_XYZ",
4950
"spring.ai.openai.chat.options.temperature=0.55")
5051
// @formatter:on
51-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class))
52+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class))
5253
.run(context -> {
5354
var chatProperties = context.getBean(OpenAiChatProperties.class);
5455
var connectionProperties = context.getBean(OpenAiConnectionProperties.class);
@@ -76,7 +77,7 @@ public void chatOverrideConnectionProperties() {
7677
"spring.ai.openai.chat.options.model=MODEL_XYZ",
7778
"spring.ai.openai.chat.options.temperature=0.55")
7879
// @formatter:on
79-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class))
80+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class))
8081
.run(context -> {
8182
var chatProperties = context.getBean(OpenAiChatProperties.class);
8283
var connectionProperties = context.getBean(OpenAiConnectionProperties.class);
@@ -101,7 +102,7 @@ public void embeddingProperties() {
101102
"spring.ai.openai.api-key=abc123",
102103
"spring.ai.openai.embedding.options.model=MODEL_XYZ")
103104
// @formatter:on
104-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class))
105+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class))
105106
.run(context -> {
106107
var embeddingProperties = context.getBean(OpenAiEmbeddingProperties.class);
107108
var connectionProperties = context.getBean(OpenAiConnectionProperties.class);
@@ -127,7 +128,7 @@ public void embeddingOverrideConnectionProperties() {
127128
"spring.ai.openai.embedding.api-key=456",
128129
"spring.ai.openai.embedding.options.model=MODEL_XYZ")
129130
// @formatter:on
130-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class))
131+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class))
131132
.run(context -> {
132133
var embeddingProperties = context.getBean(OpenAiEmbeddingProperties.class);
133134
var connectionProperties = context.getBean(OpenAiConnectionProperties.class);
@@ -151,7 +152,7 @@ public void imageProperties() {
151152
"spring.ai.openai.image.options.model=MODEL_XYZ",
152153
"spring.ai.openai.image.options.n=3")
153154
// @formatter:on
154-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class))
155+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class))
155156
.run(context -> {
156157
var imageProperties = context.getBean(OpenAiImageProperties.class);
157158
var connectionProperties = context.getBean(OpenAiConnectionProperties.class);
@@ -178,7 +179,7 @@ public void imageOverrideConnectionProperties() {
178179
"spring.ai.openai.image.options.model=MODEL_XYZ",
179180
"spring.ai.openai.image.options.n=3")
180181
// @formatter:on
181-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class))
182+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class))
182183
.run(context -> {
183184
var imageProperties = context.getBean(OpenAiImageProperties.class);
184185
var connectionProperties = context.getBean(OpenAiConnectionProperties.class);
@@ -245,7 +246,7 @@ public void chatOptionsTest() {
245246
"spring.ai.openai.chat.options.user=userXYZ"
246247
)
247248
// @formatter:on
248-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class))
249+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class))
249250
.run(context -> {
250251
var chatProperties = context.getBean(OpenAiChatProperties.class);
251252
var connectionProperties = context.getBean(OpenAiConnectionProperties.class);
@@ -295,7 +296,7 @@ public void embeddingOptionsTest() {
295296
"spring.ai.openai.embedding.options.user=userXYZ"
296297
)
297298
// @formatter:on
298-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class))
299+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class))
299300
.run(context -> {
300301
var connectionProperties = context.getBean(OpenAiConnectionProperties.class);
301302
var embeddingProperties = context.getBean(OpenAiEmbeddingProperties.class);
@@ -327,7 +328,7 @@ public void imageOptionsTest() {
327328
"spring.ai.openai.image.options.user=userXYZ"
328329
)
329330
// @formatter:on
330-
.withConfiguration(AutoConfigurations.of(OpenAiAutoConfiguration.class))
331+
.withConfiguration(AutoConfigurations.of(RestClientAutoConfiguration.class, OpenAiAutoConfiguration.class))
331332
.run(context -> {
332333
var imageProperties = context.getBean(OpenAiImageProperties.class);
333334
var connectionProperties = context.getBean(OpenAiConnectionProperties.class);

0 commit comments

Comments
 (0)