From 782d4ead9e7984e74b3ef6d5aba7dabbed5a1c00 Mon Sep 17 00:00:00 2001 From: lexluo09 <39718951+lexluo09@users.noreply.github.com> Date: Sat, 22 Jun 2024 16:39:32 +0800 Subject: [PATCH] (improvement)(common) support dashscope in springboot (#1192) --- common/pom.xml | 8 +- .../dashscope/spring/ChatModelProperties.java | 22 ++++ .../dashscope/spring/DashscopeAutoConfig.java | 105 ++++++++++++++++++ .../spring/EmbeddingModelProperties.java | 12 ++ .../dashscope/spring/Properties.java | 29 +++++ .../qianfan/spring/QianfanAutoConfig.java | 2 +- pom.xml | 6 + 7 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 common/src/main/java/dev/langchain4j/dashscope/spring/ChatModelProperties.java create mode 100644 common/src/main/java/dev/langchain4j/dashscope/spring/DashscopeAutoConfig.java create mode 100644 common/src/main/java/dev/langchain4j/dashscope/spring/EmbeddingModelProperties.java create mode 100644 common/src/main/java/dev/langchain4j/dashscope/spring/Properties.java diff --git a/common/pom.xml b/common/pom.xml index 060063a65..afd0affd6 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> supersonic com.tencent.supersonic @@ -225,6 +225,10 @@ dev.langchain4j langchain4j-zhipu-ai + + dev.langchain4j + langchain4j-dashscope + com.hankcs diff --git a/common/src/main/java/dev/langchain4j/dashscope/spring/ChatModelProperties.java b/common/src/main/java/dev/langchain4j/dashscope/spring/ChatModelProperties.java new file mode 100644 index 000000000..7a407cb8f --- /dev/null +++ b/common/src/main/java/dev/langchain4j/dashscope/spring/ChatModelProperties.java @@ -0,0 +1,22 @@ +package dev.langchain4j.dashscope.spring; + +import java.util.List; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +class ChatModelProperties { + + String baseUrl; + String apiKey; + String modelName; + Double topP; + Integer topK; + Boolean enableSearch; + Integer seed; + Float repetitionPenalty; + Float temperature; + List stops; + Integer maxTokens; +} \ No newline at end of file diff --git a/common/src/main/java/dev/langchain4j/dashscope/spring/DashscopeAutoConfig.java b/common/src/main/java/dev/langchain4j/dashscope/spring/DashscopeAutoConfig.java new file mode 100644 index 000000000..61cf9106f --- /dev/null +++ b/common/src/main/java/dev/langchain4j/dashscope/spring/DashscopeAutoConfig.java @@ -0,0 +1,105 @@ +package dev.langchain4j.dashscope.spring; + + +import static dev.langchain4j.dashscope.spring.Properties.PREFIX; + +import dev.langchain4j.model.dashscope.QwenChatModel; +import dev.langchain4j.model.dashscope.QwenEmbeddingModel; +import dev.langchain4j.model.dashscope.QwenLanguageModel; +import dev.langchain4j.model.dashscope.QwenStreamingChatModel; +import dev.langchain4j.model.dashscope.QwenStreamingLanguageModel; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@EnableConfigurationProperties(Properties.class) +public class DashscopeAutoConfig { + + @Bean + @ConditionalOnProperty(PREFIX + ".chat-model.api-key") + QwenChatModel qwenChatModel(Properties properties) { + ChatModelProperties chatModelProperties = properties.getChatModel(); + return QwenChatModel.builder() + .baseUrl(chatModelProperties.getBaseUrl()) + .apiKey(chatModelProperties.getApiKey()) + .modelName(chatModelProperties.getModelName()) + .topP(chatModelProperties.getTopP()) + .topK(chatModelProperties.getTopK()) + .enableSearch(chatModelProperties.getEnableSearch()) + .seed(chatModelProperties.getSeed()) + .repetitionPenalty(chatModelProperties.getRepetitionPenalty()) + .temperature(chatModelProperties.getTemperature()) + .stops(chatModelProperties.getStops()) + .maxTokens(chatModelProperties.getMaxTokens()) + .build(); + } + + @Bean + @ConditionalOnProperty(PREFIX + ".streaming-chat-model.api-key") + QwenStreamingChatModel qwenStreamingChatModel(Properties properties) { + ChatModelProperties chatModelProperties = properties.getStreamingChatModel(); + return QwenStreamingChatModel.builder() + .baseUrl(chatModelProperties.getBaseUrl()) + .apiKey(chatModelProperties.getApiKey()) + .modelName(chatModelProperties.getModelName()) + .topP(chatModelProperties.getTopP()) + .topK(chatModelProperties.getTopK()) + .enableSearch(chatModelProperties.getEnableSearch()) + .seed(chatModelProperties.getSeed()) + .repetitionPenalty(chatModelProperties.getRepetitionPenalty()) + .temperature(chatModelProperties.getTemperature()) + .stops(chatModelProperties.getStops()) + .maxTokens(chatModelProperties.getMaxTokens()) + .build(); + } + + @Bean + @ConditionalOnProperty(PREFIX + ".language-model.api-key") + QwenLanguageModel qwenLanguageModel(Properties properties) { + ChatModelProperties languageModel = properties.getLanguageModel(); + return QwenLanguageModel.builder() + .baseUrl(languageModel.getBaseUrl()) + .apiKey(languageModel.getApiKey()) + .modelName(languageModel.getModelName()) + .topP(languageModel.getTopP()) + .topK(languageModel.getTopK()) + .enableSearch(languageModel.getEnableSearch()) + .seed(languageModel.getSeed()) + .repetitionPenalty(languageModel.getRepetitionPenalty()) + .temperature(languageModel.getTemperature()) + .stops(languageModel.getStops()) + .maxTokens(languageModel.getMaxTokens()) + .build(); + } + + @Bean + @ConditionalOnProperty(PREFIX + ".streaming-language-model.api-key") + QwenStreamingLanguageModel qwenStreamingLanguageModel(Properties properties) { + ChatModelProperties languageModel = properties.getStreamingLanguageModel(); + return QwenStreamingLanguageModel.builder() + .baseUrl(languageModel.getBaseUrl()) + .apiKey(languageModel.getApiKey()) + .modelName(languageModel.getModelName()) + .topP(languageModel.getTopP()) + .topK(languageModel.getTopK()) + .enableSearch(languageModel.getEnableSearch()) + .seed(languageModel.getSeed()) + .repetitionPenalty(languageModel.getRepetitionPenalty()) + .temperature(languageModel.getTemperature()) + .stops(languageModel.getStops()) + .maxTokens(languageModel.getMaxTokens()) + .build(); + } + + @Bean + @ConditionalOnProperty(PREFIX + ".embedding-model.api-key") + QwenEmbeddingModel qwenEmbeddingModel(Properties properties) { + EmbeddingModelProperties embeddingModelProperties = properties.getEmbeddingModel(); + return QwenEmbeddingModel.builder() + .apiKey(embeddingModelProperties.getApiKey()) + .modelName(embeddingModelProperties.getModelName()) + .build(); + } +} \ No newline at end of file diff --git a/common/src/main/java/dev/langchain4j/dashscope/spring/EmbeddingModelProperties.java b/common/src/main/java/dev/langchain4j/dashscope/spring/EmbeddingModelProperties.java new file mode 100644 index 000000000..27b09525f --- /dev/null +++ b/common/src/main/java/dev/langchain4j/dashscope/spring/EmbeddingModelProperties.java @@ -0,0 +1,12 @@ +package dev.langchain4j.dashscope.spring; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +class EmbeddingModelProperties { + + private String apiKey; + private String modelName; +} \ No newline at end of file diff --git a/common/src/main/java/dev/langchain4j/dashscope/spring/Properties.java b/common/src/main/java/dev/langchain4j/dashscope/spring/Properties.java new file mode 100644 index 000000000..2b8215626 --- /dev/null +++ b/common/src/main/java/dev/langchain4j/dashscope/spring/Properties.java @@ -0,0 +1,29 @@ +package dev.langchain4j.dashscope.spring; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.boot.context.properties.NestedConfigurationProperty; + +@Getter +@Setter +@ConfigurationProperties(prefix = Properties.PREFIX) +public class Properties { + + static final String PREFIX = "langchain4j.dashscope"; + + @NestedConfigurationProperty + ChatModelProperties chatModel; + + @NestedConfigurationProperty + ChatModelProperties streamingChatModel; + + @NestedConfigurationProperty + ChatModelProperties languageModel; + + @NestedConfigurationProperty + ChatModelProperties streamingLanguageModel; + + @NestedConfigurationProperty + EmbeddingModelProperties embeddingModel; +} \ No newline at end of file diff --git a/common/src/main/java/dev/langchain4j/qianfan/spring/QianfanAutoConfig.java b/common/src/main/java/dev/langchain4j/qianfan/spring/QianfanAutoConfig.java index 3f81f7053..1d7ecd6d5 100644 --- a/common/src/main/java/dev/langchain4j/qianfan/spring/QianfanAutoConfig.java +++ b/common/src/main/java/dev/langchain4j/qianfan/spring/QianfanAutoConfig.java @@ -77,7 +77,7 @@ public class QianfanAutoConfig { @Bean @ConditionalOnProperty(PREFIX + ".streaming-language-model.api-key") - QianfanStreamingLanguageModel openAiStreamingLanguageModel(Properties properties) { + QianfanStreamingLanguageModel qianfanStreamingLanguageModel(Properties properties) { LanguageModelProperties languageModelProperties = properties.getStreamingLanguageModel(); return QianfanStreamingLanguageModel.builder() .endpoint(languageModelProperties.getEndpoint()) diff --git a/pom.xml b/pom.xml index 4fc77f5c3..c0ff526de 100644 --- a/pom.xml +++ b/pom.xml @@ -195,6 +195,12 @@ langchain4j-zhipu-ai ${langchain4j.version} + + dev.langchain4j + langchain4j-dashscope + ${langchain4j.version} + + org.springframework.boot spring-boot-autoconfigure-processor