From 196411949453d53d26a201864cf888cb79577b22 Mon Sep 17 00:00:00 2001 From: yuluo-yx Date: Tue, 24 Sep 2024 21:19:50 +0800 Subject: [PATCH 1/3] feat: support read apikey from system env Signed-off-by: yuluo-yx --- .../dashscope/DashScopeAutoConfiguration.java | 94 ++++++++++++++----- 1 file changed, 70 insertions(+), 24 deletions(-) diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java index 0c5f3d7..9ad11b8 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java @@ -22,8 +22,10 @@ import java.util.Map; import java.util.Objects; +import com.alibaba.cloud.ai.constant.AIConstants; import com.alibaba.cloud.ai.dashscope.api.DashScopeAgentApi; import com.alibaba.cloud.ai.dashscope.api.DashScopeImageApi; +import com.alibaba.cloud.ai.dashscope.common.DashScopeApiConstants; import com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingModel; import com.alibaba.cloud.ai.dashscope.api.DashScopeApi; import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel; @@ -68,14 +70,24 @@ * @author yuluo * @since 2024/8/16 11:45 */ -@AutoConfiguration(after = { RestClientAutoConfiguration.class, WebClientAutoConfiguration.class, - SpringAiRetryAutoConfiguration.class }) @ConditionalOnClass(DashScopeApi.class) -@EnableConfigurationProperties({ DashScopeConnectionProperties.class, DashScopeChatProperties.class, - DashScopeImageProperties.class, DashScopeAudioTranscriptionProperties.class, - DashScopeAudioSpeechProperties.class, DashScopeEmbeddingProperties.class }) -@ImportAutoConfiguration(classes = { SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class, - WebClientAutoConfiguration.class }) +@AutoConfiguration(after = { + RestClientAutoConfiguration.class, + WebClientAutoConfiguration.class, + SpringAiRetryAutoConfiguration.class +}) +@EnableConfigurationProperties({ + DashScopeConnectionProperties.class, + DashScopeChatProperties.class, + DashScopeImageProperties.class, + DashScopeAudioTranscriptionProperties.class, + DashScopeAudioSpeechProperties.class, + DashScopeEmbeddingProperties.class }) +@ImportAutoConfiguration(classes = { + SpringAiRetryAutoConfiguration.class, + RestClientAutoConfiguration.class, + WebClientAutoConfiguration.class +}) public class DashScopeAutoConfiguration { @Bean @@ -93,8 +105,12 @@ public Transcription transcription() { @Bean @ConditionalOnMissingBean - @ConditionalOnProperty(prefix = DashScopeChatProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", - matchIfMissing = true) + @ConditionalOnProperty( + prefix = DashScopeChatProperties.CONFIG_PREFIX, + name = "enabled", + havingValue = "true", + matchIfMissing = true + ) public DashScopeChatModel dashscopeChatModel(DashScopeConnectionProperties commonProperties, DashScopeChatProperties chatProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, List toolFunctionCallbacks, @@ -114,8 +130,12 @@ public DashScopeChatModel dashscopeChatModel(DashScopeConnectionProperties commo @Bean @ConditionalOnMissingBean - @ConditionalOnProperty(prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", - matchIfMissing = true) + @ConditionalOnProperty( + prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, + name = "enabled", + havingValue = "true", + matchIfMissing = true + ) public DashScopeApi dashscopeChatApi(DashScopeConnectionProperties commonProperties, DashScopeChatProperties chatProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, ResponseErrorHandler responseErrorHandler) { @@ -129,8 +149,12 @@ public DashScopeApi dashscopeChatApi(DashScopeConnectionProperties commonPropert @Bean @ConditionalOnMissingBean - @ConditionalOnProperty(prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", - matchIfMissing = true) + @ConditionalOnProperty( + prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, + name = "enabled", + havingValue = "true", + matchIfMissing = true + ) public DashScopeEmbeddingModel dashscopeEmbeddingModel(DashScopeConnectionProperties commonProperties, DashScopeEmbeddingProperties embeddingProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, RetryTemplate retryTemplate, @@ -143,10 +167,13 @@ public DashScopeEmbeddingModel dashscopeEmbeddingModel(DashScopeConnectionProper embeddingProperties.getOptions(), retryTemplate); } - public DashScopeApi dashscopeEmbeddingApi(DashScopeConnectionProperties commonProperties, - DashScopeEmbeddingProperties embeddingProperties, RestClient.Builder restClientBuilder, - WebClient.Builder webClientBuilder, ResponseErrorHandler responseErrorHandler) { - + public DashScopeApi dashscopeEmbeddingApi( + DashScopeConnectionProperties commonProperties, + DashScopeEmbeddingProperties embeddingProperties, + RestClient.Builder restClientBuilder, + WebClient.Builder webClientBuilder, + ResponseErrorHandler responseErrorHandler + ) { DashScopeAutoConfiguration.ResolvedConnectionProperties resolved = resolveConnectionProperties(commonProperties, embeddingProperties, "embedding"); @@ -156,8 +183,12 @@ public DashScopeApi dashscopeEmbeddingApi(DashScopeConnectionProperties commonPr @Bean @ConditionalOnMissingBean - @ConditionalOnProperty(prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", - matchIfMissing = true) + @ConditionalOnProperty( + prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, + name = "enabled", + havingValue = "true", + matchIfMissing = true + ) public DashScopeAgentApi dashscopeAgentApi(DashScopeConnectionProperties commonProperties, DashScopeChatProperties chatProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, ResponseErrorHandler responseErrorHandler) { @@ -178,8 +209,12 @@ public RestClientCustomizer restClientCustomizer(DashScopeConnectionProperties c @Bean @ConditionalOnMissingBean - @ConditionalOnProperty(prefix = DashScopeImageProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", - matchIfMissing = true) + @ConditionalOnProperty( + prefix = DashScopeImageProperties.CONFIG_PREFIX, + name = "enabled", + havingValue = "true", + matchIfMissing = true + ) public DashScopeImageModel dashScopeImageModel(DashScopeConnectionProperties commonProperties, DashScopeImageProperties imageProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, RetryTemplate retryTemplate, @@ -197,14 +232,18 @@ public DashScopeImageModel dashScopeImageModel(DashScopeConnectionProperties com @Bean @ConditionalOnMissingBean public FunctionCallbackContext springAiFunctionManager(ApplicationContext context) { + FunctionCallbackContext manager = new FunctionCallbackContext(); manager.setApplicationContext(context); return manager; } - private record ResolvedConnectionProperties(String baseUrl, String apiKey, String workspaceId, - MultiValueMap headers) { - } + private record ResolvedConnectionProperties( + String baseUrl, + String apiKey, + String workspaceId, + MultiValueMap headers + ) { } private static @NotNull DashScopeAutoConfiguration.ResolvedConnectionProperties resolveConnectionProperties( DashScopeParentProperties commonProperties, DashScopeParentProperties modelProperties, String modelType) { @@ -221,6 +260,13 @@ private record ResolvedConnectionProperties(String baseUrl, String apiKey, Strin connectionHeaders.put("DashScope-Workspace", List.of(workspaceId)); } + // get apikey from system env. + if (Objects.isNull(apiKey)) { + if (Objects.nonNull(System.getenv(DashScopeApiConstants.DASHSCOPE_API_KEY))) { + apiKey = System.getenv(DashScopeApiConstants.DASHSCOPE_API_KEY); + } + } + Assert.hasText(baseUrl, "DashScope base URL must be set. Use the connection property: spring.ai.dashscope.base-url or spring.ai.dashscope." + modelType + ".base-url property."); From 4147474ff74c7af68a21658e6a8466b50d2f9a77 Mon Sep 17 00:00:00 2001 From: yuluo-yx Date: Tue, 24 Sep 2024 21:20:55 +0800 Subject: [PATCH 2/3] fix Signed-off-by: yuluo-yx --- .../autoconfigure/dashscope/DashScopeAutoConfiguration.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java index 9ad11b8..7c62de5 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java @@ -22,7 +22,6 @@ import java.util.Map; import java.util.Objects; -import com.alibaba.cloud.ai.constant.AIConstants; import com.alibaba.cloud.ai.dashscope.api.DashScopeAgentApi; import com.alibaba.cloud.ai.dashscope.api.DashScopeImageApi; import com.alibaba.cloud.ai.dashscope.common.DashScopeApiConstants; @@ -32,9 +31,6 @@ import com.alibaba.cloud.ai.dashscope.image.DashScopeImageModel; import com.alibaba.dashscope.audio.asr.transcription.Transcription; import com.alibaba.dashscope.audio.tts.SpeechSynthesizer; -import com.alibaba.dashscope.exception.NoApiKeyException; -import com.alibaba.dashscope.utils.ApiKey; -import com.alibaba.dashscope.utils.Constants; import org.jetbrains.annotations.NotNull; import org.springframework.ai.autoconfigure.retry.SpringAiRetryAutoConfiguration; @@ -63,8 +59,6 @@ import org.springframework.web.client.RestClient; import org.springframework.web.reactive.function.client.WebClient; -import static com.alibaba.cloud.ai.dashscope.common.DashScopeApiConstants.DASHSCOPE_API_KEY; - /** * @author nuocheng.lxm * @author yuluo From e25b59c4c55013347974a93e01683c339ede1a9e Mon Sep 17 00:00:00 2001 From: yuluo-yx Date: Tue, 24 Sep 2024 21:25:12 +0800 Subject: [PATCH 3/3] fix Signed-off-by: yuluo-yx --- .../dashscope/DashScopeAutoConfiguration.java | 83 +++++-------------- 1 file changed, 23 insertions(+), 60 deletions(-) diff --git a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java index 7c62de5..f050baa 100644 --- a/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java +++ b/spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/autoconfigure/dashscope/DashScopeAutoConfiguration.java @@ -65,23 +65,13 @@ * @since 2024/8/16 11:45 */ @ConditionalOnClass(DashScopeApi.class) -@AutoConfiguration(after = { - RestClientAutoConfiguration.class, - WebClientAutoConfiguration.class, - SpringAiRetryAutoConfiguration.class -}) -@EnableConfigurationProperties({ - DashScopeConnectionProperties.class, - DashScopeChatProperties.class, - DashScopeImageProperties.class, - DashScopeAudioTranscriptionProperties.class, - DashScopeAudioSpeechProperties.class, - DashScopeEmbeddingProperties.class }) -@ImportAutoConfiguration(classes = { - SpringAiRetryAutoConfiguration.class, - RestClientAutoConfiguration.class, - WebClientAutoConfiguration.class -}) +@AutoConfiguration(after = { RestClientAutoConfiguration.class, WebClientAutoConfiguration.class, + SpringAiRetryAutoConfiguration.class }) +@EnableConfigurationProperties({ DashScopeConnectionProperties.class, DashScopeChatProperties.class, + DashScopeImageProperties.class, DashScopeAudioTranscriptionProperties.class, + DashScopeAudioSpeechProperties.class, DashScopeEmbeddingProperties.class }) +@ImportAutoConfiguration(classes = { SpringAiRetryAutoConfiguration.class, RestClientAutoConfiguration.class, + WebClientAutoConfiguration.class }) public class DashScopeAutoConfiguration { @Bean @@ -99,12 +89,8 @@ public Transcription transcription() { @Bean @ConditionalOnMissingBean - @ConditionalOnProperty( - prefix = DashScopeChatProperties.CONFIG_PREFIX, - name = "enabled", - havingValue = "true", - matchIfMissing = true - ) + @ConditionalOnProperty(prefix = DashScopeChatProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", + matchIfMissing = true) public DashScopeChatModel dashscopeChatModel(DashScopeConnectionProperties commonProperties, DashScopeChatProperties chatProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, List toolFunctionCallbacks, @@ -124,12 +110,8 @@ public DashScopeChatModel dashscopeChatModel(DashScopeConnectionProperties commo @Bean @ConditionalOnMissingBean - @ConditionalOnProperty( - prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, - name = "enabled", - havingValue = "true", - matchIfMissing = true - ) + @ConditionalOnProperty(prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", + matchIfMissing = true) public DashScopeApi dashscopeChatApi(DashScopeConnectionProperties commonProperties, DashScopeChatProperties chatProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, ResponseErrorHandler responseErrorHandler) { @@ -143,12 +125,8 @@ public DashScopeApi dashscopeChatApi(DashScopeConnectionProperties commonPropert @Bean @ConditionalOnMissingBean - @ConditionalOnProperty( - prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, - name = "enabled", - havingValue = "true", - matchIfMissing = true - ) + @ConditionalOnProperty(prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", + matchIfMissing = true) public DashScopeEmbeddingModel dashscopeEmbeddingModel(DashScopeConnectionProperties commonProperties, DashScopeEmbeddingProperties embeddingProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, RetryTemplate retryTemplate, @@ -161,13 +139,9 @@ public DashScopeEmbeddingModel dashscopeEmbeddingModel(DashScopeConnectionProper embeddingProperties.getOptions(), retryTemplate); } - public DashScopeApi dashscopeEmbeddingApi( - DashScopeConnectionProperties commonProperties, - DashScopeEmbeddingProperties embeddingProperties, - RestClient.Builder restClientBuilder, - WebClient.Builder webClientBuilder, - ResponseErrorHandler responseErrorHandler - ) { + public DashScopeApi dashscopeEmbeddingApi(DashScopeConnectionProperties commonProperties, + DashScopeEmbeddingProperties embeddingProperties, RestClient.Builder restClientBuilder, + WebClient.Builder webClientBuilder, ResponseErrorHandler responseErrorHandler) { DashScopeAutoConfiguration.ResolvedConnectionProperties resolved = resolveConnectionProperties(commonProperties, embeddingProperties, "embedding"); @@ -177,12 +151,8 @@ public DashScopeApi dashscopeEmbeddingApi( @Bean @ConditionalOnMissingBean - @ConditionalOnProperty( - prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, - name = "enabled", - havingValue = "true", - matchIfMissing = true - ) + @ConditionalOnProperty(prefix = DashScopeEmbeddingProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", + matchIfMissing = true) public DashScopeAgentApi dashscopeAgentApi(DashScopeConnectionProperties commonProperties, DashScopeChatProperties chatProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, ResponseErrorHandler responseErrorHandler) { @@ -203,12 +173,8 @@ public RestClientCustomizer restClientCustomizer(DashScopeConnectionProperties c @Bean @ConditionalOnMissingBean - @ConditionalOnProperty( - prefix = DashScopeImageProperties.CONFIG_PREFIX, - name = "enabled", - havingValue = "true", - matchIfMissing = true - ) + @ConditionalOnProperty(prefix = DashScopeImageProperties.CONFIG_PREFIX, name = "enabled", havingValue = "true", + matchIfMissing = true) public DashScopeImageModel dashScopeImageModel(DashScopeConnectionProperties commonProperties, DashScopeImageProperties imageProperties, RestClient.Builder restClientBuilder, WebClient.Builder webClientBuilder, RetryTemplate retryTemplate, @@ -232,12 +198,9 @@ public FunctionCallbackContext springAiFunctionManager(ApplicationContext contex return manager; } - private record ResolvedConnectionProperties( - String baseUrl, - String apiKey, - String workspaceId, - MultiValueMap headers - ) { } + private record ResolvedConnectionProperties(String baseUrl, String apiKey, String workspaceId, + MultiValueMap headers) { + } private static @NotNull DashScopeAutoConfiguration.ResolvedConnectionProperties resolveConnectionProperties( DashScopeParentProperties commonProperties, DashScopeParentProperties modelProperties, String modelType) {