From b9940c03186364dd8aaa4ff42d6f77f2d3d45434 Mon Sep 17 00:00:00 2001 From: Pawel Potaczala <30981922+centrumek@users.noreply.github.com> Date: Wed, 8 Oct 2025 17:53:40 +0200 Subject: [PATCH] Fix ElevenLabs auto-configuration Signed-off-by: Pawel Potaczala <30981922+centrumek@users.noreply.github.com> --- .../ElevenLabsAutoConfiguration.java | 3 -- .../ElevenLabsAutoConfigurationIT.java | 3 +- .../autoconfigure/ElevenLabsITUtil.java | 45 +++++++++++++++++++ .../ElevenLabsPropertiesTests.java | 11 +++-- 4 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsITUtil.java diff --git a/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/main/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfiguration.java b/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/main/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfiguration.java index b2578a93939..bbff2dcf71e 100644 --- a/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/main/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfiguration.java +++ b/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/main/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfiguration.java @@ -21,7 +21,6 @@ import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -45,8 +44,6 @@ @EnableConfigurationProperties({ ElevenLabsSpeechProperties.class, ElevenLabsConnectionProperties.class }) @ConditionalOnProperty(prefix = ElevenLabsSpeechProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", matchIfMissing = true) -@ImportAutoConfiguration(classes = { SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class, - WebClientAutoConfiguration.class }) public class ElevenLabsAutoConfiguration { @Bean diff --git a/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfigurationIT.java b/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfigurationIT.java index e01c1948b66..493a8d17441 100644 --- a/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfigurationIT.java +++ b/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsAutoConfigurationIT.java @@ -22,7 +22,6 @@ import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable; import org.springframework.ai.elevenlabs.ElevenLabsTextToSpeechModel; -import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import static org.assertj.core.api.Assertions.assertThat; @@ -40,7 +39,7 @@ public class ElevenLabsAutoConfigurationIT { private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withPropertyValues("spring.ai.elevenlabs.api-key=" + System.getenv("ELEVEN_LABS_API_KEY")) - .withConfiguration(AutoConfigurations.of(ElevenLabsAutoConfiguration.class)); + .withConfiguration(ElevenLabsITUtil.elevenLabsAutoConfig(ElevenLabsAutoConfiguration.class)); @Test void speech() { diff --git a/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsITUtil.java b/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsITUtil.java new file mode 100644 index 00000000000..9cd2b178856 --- /dev/null +++ b/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsITUtil.java @@ -0,0 +1,45 @@ +/* + * Copyright 2025-2025 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.ai.model.elevenlabs.autoconfigure; + +import org.springframework.ai.retry.autoconfigure.SpringAiRetryAutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.web.client.RestClientAutoConfiguration; +import org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration; + +/** + * Utility class for ElevenLabs integration tests. + * + * @author Pawel Potaczala + */ +public final class ElevenLabsITUtil { + + private ElevenLabsITUtil() { + } + + public static AutoConfigurations elevenLabsAutoConfig(Class... additionalAutoConfigurations) { + Class[] dependencies = new Class[] { SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class, + WebClientAutoConfiguration.class }; + Class[] allAutoConfigurations = new Class[dependencies.length + additionalAutoConfigurations.length]; + System.arraycopy(dependencies, 0, allAutoConfigurations, 0, dependencies.length); + System.arraycopy(additionalAutoConfigurations, 0, allAutoConfigurations, dependencies.length, + additionalAutoConfigurations.length); + + return AutoConfigurations.of(allAutoConfigurations); + } + +} diff --git a/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsPropertiesTests.java b/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsPropertiesTests.java index 29ba913db57..e3aa6555d9f 100644 --- a/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsPropertiesTests.java +++ b/auto-configurations/models/spring-ai-autoconfigure-model-elevenlabs/src/test/java/org/springframework/ai/model/elevenlabs/autoconfigure/ElevenLabsPropertiesTests.java @@ -20,7 +20,6 @@ import org.springframework.ai.elevenlabs.ElevenLabsTextToSpeechModel; import org.springframework.ai.elevenlabs.api.ElevenLabsApi; -import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.test.context.runner.ApplicationContextRunner; import static org.assertj.core.api.Assertions.assertThat; @@ -47,7 +46,7 @@ public void connectionProperties() { "spring.ai.elevenlabs.tts.options.voice-settings.use-speaker-boost=false", "spring.ai.elevenlabs.tts.options.voice-settings.speed=1.5" // @formatter:on - ).withConfiguration(AutoConfigurations.of(ElevenLabsAutoConfiguration.class)).run(context -> { + ).withConfiguration(ElevenLabsITUtil.elevenLabsAutoConfig(ElevenLabsAutoConfiguration.class)).run(context -> { var speechProperties = context.getBean(ElevenLabsSpeechProperties.class); var connectionProperties = context.getBean(ElevenLabsConnectionProperties.class); @@ -87,7 +86,7 @@ public void speechOptionsTest() { "spring.ai.elevenlabs.tts.options.apply-text-normalization=ON", "spring.ai.elevenlabs.tts.options.apply-language-text-normalization=true" // @formatter:on - ).withConfiguration(AutoConfigurations.of(ElevenLabsAutoConfiguration.class)).run(context -> { + ).withConfiguration(ElevenLabsITUtil.elevenLabsAutoConfig(ElevenLabsAutoConfiguration.class)).run(context -> { var speechProperties = context.getBean(ElevenLabsSpeechProperties.class); assertThat(speechProperties.getOptions().getModelId()).isEqualTo("custom-model"); @@ -114,7 +113,7 @@ public void speechActivation() { // It is enabled by default new ApplicationContextRunner().withPropertyValues("spring.ai.elevenlabs.api-key=YOUR_API_KEY") - .withConfiguration(AutoConfigurations.of(ElevenLabsAutoConfiguration.class)) + .withConfiguration(ElevenLabsITUtil.elevenLabsAutoConfig(ElevenLabsAutoConfiguration.class)) .run(context -> { assertThat(context.getBeansOfType(ElevenLabsSpeechProperties.class)).isNotEmpty(); assertThat(context.getBeansOfType(ElevenLabsTextToSpeechModel.class)).isNotEmpty(); @@ -123,7 +122,7 @@ public void speechActivation() { // Explicitly enable the text-to-speech autoconfiguration. new ApplicationContextRunner() .withPropertyValues("spring.ai.elevenlabs.api-key=YOUR_API_KEY", "spring.ai.elevenlabs.tts.enabled=true") - .withConfiguration(AutoConfigurations.of(ElevenLabsAutoConfiguration.class)) + .withConfiguration(ElevenLabsITUtil.elevenLabsAutoConfig(ElevenLabsAutoConfiguration.class)) .run(context -> { assertThat(context.getBeansOfType(ElevenLabsSpeechProperties.class)).isNotEmpty(); assertThat(context.getBeansOfType(ElevenLabsTextToSpeechModel.class)).isNotEmpty(); @@ -132,7 +131,7 @@ public void speechActivation() { // Explicitly disable the text-to-speech autoconfiguration. new ApplicationContextRunner() .withPropertyValues("spring.ai.elevenlabs.api-key=YOUR_API_KEY", "spring.ai.elevenlabs.tts.enabled=false") - .withConfiguration(AutoConfigurations.of(ElevenLabsAutoConfiguration.class)) + .withConfiguration(ElevenLabsITUtil.elevenLabsAutoConfig(ElevenLabsAutoConfiguration.class)) .run(context -> { assertThat(context.getBeansOfType(ElevenLabsSpeechProperties.class)).isEmpty(); assertThat(context.getBeansOfType(ElevenLabsTextToSpeechModel.class)).isEmpty();