diff --git a/auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiChatAutoConfiguration.java b/auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiChatAutoConfiguration.java index f8f5f801a11..92dded85d49 100644 --- a/auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiChatAutoConfiguration.java +++ b/auto-configurations/models/spring-ai-autoconfigure-model-openai/src/main/java/org/springframework/ai/model/openai/autoconfigure/OpenAiChatAutoConfiguration.java @@ -64,32 +64,16 @@ public class OpenAiChatAutoConfiguration { @Bean @ConditionalOnMissingBean - public OpenAiApi openAiApi(OpenAiConnectionProperties commonProperties, OpenAiChatProperties chatProperties, + public OpenAiChatModel openAiChatModel(OpenAiConnectionProperties commonProperties, + OpenAiChatProperties chatProperties, ToolCallingManager toolCallingManager, RetryTemplate retryTemplate, + ObjectProvider observationRegistry, + ObjectProvider observationConvention, + ObjectProvider openAiToolExecutionEligibilityPredicate, ObjectProvider restClientBuilderProvider, ObjectProvider webClientBuilderProvider, ResponseErrorHandler responseErrorHandler) { - OpenAIAutoConfigurationUtil.ResolvedConnectionProperties resolved = resolveConnectionProperties( - commonProperties, chatProperties, "chat"); - - return OpenAiApi.builder() - .baseUrl(resolved.baseUrl()) - .apiKey(new SimpleApiKey(resolved.apiKey())) - .headers(resolved.headers()) - .completionsPath(chatProperties.getCompletionsPath()) - .embeddingsPath(OpenAiEmbeddingProperties.DEFAULT_EMBEDDINGS_PATH) - .restClientBuilder(restClientBuilderProvider.getIfAvailable(RestClient::builder)) - .webClientBuilder(webClientBuilderProvider.getIfAvailable(WebClient::builder)) - .responseErrorHandler(responseErrorHandler) - .build(); - } - - @Bean - @ConditionalOnMissingBean - public OpenAiChatModel openAiChatModel(OpenAiApi openAiApi, OpenAiChatProperties chatProperties, - ToolCallingManager toolCallingManager, RetryTemplate retryTemplate, - ObjectProvider observationRegistry, - ObjectProvider observationConvention, - ObjectProvider openAiToolExecutionEligibilityPredicate) { + OpenAiApi openAiApi = openAiApi(commonProperties, chatProperties, restClientBuilderProvider, + webClientBuilderProvider, responseErrorHandler); var chatModel = OpenAiChatModel.builder() .openAiApi(openAiApi) @@ -106,4 +90,23 @@ public OpenAiChatModel openAiChatModel(OpenAiApi openAiApi, OpenAiChatProperties return chatModel; } + private OpenAiApi openAiApi(OpenAiConnectionProperties commonProperties, OpenAiChatProperties chatProperties, + ObjectProvider restClientBuilderProvider, + ObjectProvider webClientBuilderProvider, ResponseErrorHandler responseErrorHandler) { + + OpenAIAutoConfigurationUtil.ResolvedConnectionProperties resolved = resolveConnectionProperties( + commonProperties, chatProperties, "chat"); + + return OpenAiApi.builder() + .baseUrl(resolved.baseUrl()) + .apiKey(new SimpleApiKey(resolved.apiKey())) + .headers(resolved.headers()) + .completionsPath(chatProperties.getCompletionsPath()) + .embeddingsPath(OpenAiEmbeddingProperties.DEFAULT_EMBEDDINGS_PATH) + .restClientBuilder(restClientBuilderProvider.getIfAvailable(RestClient::builder)) + .webClientBuilder(webClientBuilderProvider.getIfAvailable(WebClient::builder)) + .responseErrorHandler(responseErrorHandler) + .build(); + } + } diff --git a/auto-configurations/models/spring-ai-autoconfigure-model-openai/src/test/java/org/springframework/ai/model/openai/autoconfigure/OpenAiModelConfigurationTests.java b/auto-configurations/models/spring-ai-autoconfigure-model-openai/src/test/java/org/springframework/ai/model/openai/autoconfigure/OpenAiModelConfigurationTests.java index 2d720dec24a..cb48ea537a8 100644 --- a/auto-configurations/models/spring-ai-autoconfigure-model-openai/src/test/java/org/springframework/ai/model/openai/autoconfigure/OpenAiModelConfigurationTests.java +++ b/auto-configurations/models/spring-ai-autoconfigure-model-openai/src/test/java/org/springframework/ai/model/openai/autoconfigure/OpenAiModelConfigurationTests.java @@ -24,7 +24,6 @@ import org.springframework.ai.openai.OpenAiEmbeddingModel; import org.springframework.ai.openai.OpenAiImageModel; import org.springframework.ai.openai.OpenAiModerationModel; -import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.ai.utils.SpringAiTestAutoConfigurations; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; @@ -46,7 +45,6 @@ public class OpenAiModelConfigurationTests { void chatModelActivation() { this.contextRunner.withConfiguration(SpringAiTestAutoConfigurations.of(OpenAiChatAutoConfiguration.class)) .run(context -> { - assertThat(context.getBeansOfType(OpenAiApi.class)).isNotEmpty(); assertThat(context.getBeansOfType(OpenAiChatModel.class)).isNotEmpty(); assertThat(context.getBeansOfType(OpenAiEmbeddingModel.class)).isEmpty(); assertThat(context.getBeansOfType(OpenAiImageModel.class)).isEmpty(); @@ -315,15 +313,4 @@ void moderationModelActivation() { }); } - @Test - void openAiApiBean() { - // Test that OpenAiApi bean is registered and can be injected - this.contextRunner.withConfiguration(SpringAiTestAutoConfigurations.of(OpenAiChatAutoConfiguration.class)) - .run(context -> { - assertThat(context.getBeansOfType(OpenAiApi.class)).hasSize(1); - OpenAiApi openAiApi = context.getBean(OpenAiApi.class); - assertThat(openAiApi).isNotNull(); - }); - } - }