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 29715e21f3..629a3cf14f 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 @@ -61,6 +61,8 @@ public class OpenAiChatAutoConfiguration { @Bean @ConditionalOnMissingBean + @ConditionalOnProperty(prefix = "spring.ai.openai", name = { "api-key", "chat.api-key" }, + matchIfMissing = false) public OpenAiApi openAiApi(OpenAiConnectionProperties commonProperties, OpenAiChatProperties chatProperties, ObjectProvider restClientBuilderProvider, ObjectProvider webClientBuilderProvider, 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 7aa172c290..3b84988a0d 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 @@ -386,4 +386,24 @@ void openAiApiBean() { }); } + @Test + void imageOnlyApiKeyDoesNotFailChatAutoConfiguration() { + // Regression test for https://github.com/spring-projects/spring-ai/issues/1818 + // When only spring.ai.openai.image.api-key is set (no chat or common api-key), + // OpenAiChatAutoConfiguration must not throw an IllegalArgumentException. + // The OpenAiApi bean for chat should simply not be created. + new ApplicationContextRunner() + .withPropertyValues("spring.ai.openai.image.api-key=IMAGE_API_KEY", + "spring.ai.openai.base-url=TEST_BASE_URL") + .withConfiguration(AutoConfigurations.of(OpenAiChatAutoConfiguration.class, + OpenAiImageAutoConfiguration.class, RestClientAutoConfiguration.class, + SpringAiRetryAutoConfiguration.class, ToolCallingAutoConfiguration.class, + WebClientAutoConfiguration.class)) + .run(context -> { + assertThat(context).hasNotFailed(); + assertThat(context.getBeansOfType(OpenAiChatModel.class)).isEmpty(); + assertThat(context.getBeansOfType(OpenAiImageModel.class)).isNotEmpty(); + }); + } + }