From 3831f9fdf144b436232bf982fac98b639b58cc0f Mon Sep 17 00:00:00 2001 From: lexluo09 <39718951+lexluo09@users.noreply.github.com> Date: Thu, 20 Jun 2024 20:27:06 +0800 Subject: [PATCH] (improvement)(common) support qianfan in springboot (#1175) --- common/pom.xml | 12 ++ .../qianfan/spring/AutoConfig.java | 114 ++++++++++++++++++ .../qianfan/spring/ChatModelProperties.java | 21 ++++ .../spring/EmbeddingModelProperties.java | 19 +++ .../spring/LanguageModelProperties.java | 22 ++++ .../qianfan/spring/Properties.java | 29 +++++ .../supersonic/StandaloneLauncher.java | 2 +- pom.xml | 10 ++ 8 files changed, 228 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/dev/langchain4j/qianfan/spring/AutoConfig.java create mode 100644 common/src/main/java/dev/langchain4j/qianfan/spring/ChatModelProperties.java create mode 100644 common/src/main/java/dev/langchain4j/qianfan/spring/EmbeddingModelProperties.java create mode 100644 common/src/main/java/dev/langchain4j/qianfan/spring/LanguageModelProperties.java create mode 100644 common/src/main/java/dev/langchain4j/qianfan/spring/Properties.java diff --git a/common/pom.xml b/common/pom.xml index 5c0c0a332..9f493fccb 100644 --- a/common/pom.xml +++ b/common/pom.xml @@ -217,6 +217,12 @@ dev.langchain4j langchain4j-embeddings-all-minilm-l6-v2-q + + dev.langchain4j + langchain4j-qianfan + + + com.hankcs hanlp @@ -226,6 +232,12 @@ org.apache.commons commons-lang3 + + + org.springframework.boot + spring-boot-autoconfigure-processor + + diff --git a/common/src/main/java/dev/langchain4j/qianfan/spring/AutoConfig.java b/common/src/main/java/dev/langchain4j/qianfan/spring/AutoConfig.java new file mode 100644 index 000000000..464cbb8f7 --- /dev/null +++ b/common/src/main/java/dev/langchain4j/qianfan/spring/AutoConfig.java @@ -0,0 +1,114 @@ +package dev.langchain4j.qianfan.spring; + +import dev.langchain4j.model.qianfan.QianfanChatModel; +import dev.langchain4j.model.qianfan.QianfanEmbeddingModel; +import dev.langchain4j.model.qianfan.QianfanLanguageModel; +import dev.langchain4j.model.qianfan.QianfanStreamingChatModel; +import dev.langchain4j.model.qianfan.QianfanStreamingLanguageModel; +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; + +import static dev.langchain4j.qianfan.spring.Properties.PREFIX; + +@Configuration +@EnableConfigurationProperties(Properties.class) +public class AutoConfig { + + @Bean + @ConditionalOnProperty(PREFIX + ".chat-model.api-key") + QianfanChatModel qianfanChatModel(Properties properties) { + ChatModelProperties chatModelProperties = properties.getChatModel(); + return QianfanChatModel.builder() + .baseUrl(chatModelProperties.getBaseUrl()) + .apiKey(chatModelProperties.getApiKey()) + .secretKey(chatModelProperties.getSecretKey()) + .endpoint(chatModelProperties.getEndpoint()) + .penaltyScore(chatModelProperties.getPenaltyScore()) + .modelName(chatModelProperties.getModelName()) + .temperature(chatModelProperties.getTemperature()) + .topP(chatModelProperties.getTopP()) + .responseFormat(chatModelProperties.getResponseFormat()) + .maxRetries(chatModelProperties.getMaxRetries()) + .logRequests(chatModelProperties.getLogRequests()) + .logResponses(chatModelProperties.getLogResponses()) + .build(); + } + + @Bean + @ConditionalOnProperty(PREFIX + ".streaming-chat-model.api-key") + QianfanStreamingChatModel qianfanStreamingChatModel(Properties properties) { + ChatModelProperties chatModelProperties = properties.getStreamingChatModel(); + return QianfanStreamingChatModel.builder() + .endpoint(chatModelProperties.getEndpoint()) + .penaltyScore(chatModelProperties.getPenaltyScore()) + .temperature(chatModelProperties.getTemperature()) + .topP(chatModelProperties.getTopP()) + .baseUrl(chatModelProperties.getBaseUrl()) + .apiKey(chatModelProperties.getApiKey()) + .secretKey(chatModelProperties.getSecretKey()) + .modelName(chatModelProperties.getModelName()) + .responseFormat(chatModelProperties.getResponseFormat()) + .logRequests(chatModelProperties.getLogRequests()) + .logResponses(chatModelProperties.getLogResponses()) + .build(); + } + + @Bean + @ConditionalOnProperty(PREFIX + ".language-model.api-key") + QianfanLanguageModel qianfanLanguageModel(Properties properties) { + LanguageModelProperties languageModelProperties = properties.getLanguageModel(); + return QianfanLanguageModel.builder() + .endpoint(languageModelProperties.getEndpoint()) + .penaltyScore(languageModelProperties.getPenaltyScore()) + .topK(languageModelProperties.getTopK()) + .topP(languageModelProperties.getTopP()) + .baseUrl(languageModelProperties.getBaseUrl()) + .apiKey(languageModelProperties.getApiKey()) + .secretKey(languageModelProperties.getSecretKey()) + .modelName(languageModelProperties.getModelName()) + .temperature(languageModelProperties.getTemperature()) + .maxRetries(languageModelProperties.getMaxRetries()) + .logRequests(languageModelProperties.getLogRequests()) + .logResponses(languageModelProperties.getLogResponses()) + .build(); + } + + @Bean + @ConditionalOnProperty(PREFIX + ".streaming-language-model.api-key") + QianfanStreamingLanguageModel openAiStreamingLanguageModel(Properties properties) { + LanguageModelProperties languageModelProperties = properties.getStreamingLanguageModel(); + return QianfanStreamingLanguageModel.builder() + .endpoint(languageModelProperties.getEndpoint()) + .penaltyScore(languageModelProperties.getPenaltyScore()) + .topK(languageModelProperties.getTopK()) + .topP(languageModelProperties.getTopP()) + .baseUrl(languageModelProperties.getBaseUrl()) + .apiKey(languageModelProperties.getApiKey()) + .secretKey(languageModelProperties.getSecretKey()) + .modelName(languageModelProperties.getModelName()) + .temperature(languageModelProperties.getTemperature()) + .maxRetries(languageModelProperties.getMaxRetries()) + .logRequests(languageModelProperties.getLogRequests()) + .logResponses(languageModelProperties.getLogResponses()) + .build(); + } + + @Bean + @ConditionalOnProperty(PREFIX + ".embedding-model.api-key") + QianfanEmbeddingModel qianfanEmbeddingModel(Properties properties) { + EmbeddingModelProperties embeddingModelProperties = properties.getEmbeddingModel(); + return QianfanEmbeddingModel.builder() + .baseUrl(embeddingModelProperties.getBaseUrl()) + .endpoint(embeddingModelProperties.getEndpoint()) + .apiKey(embeddingModelProperties.getApiKey()) + .secretKey(embeddingModelProperties.getSecretKey()) + .modelName(embeddingModelProperties.getModelName()) + .user(embeddingModelProperties.getUser()) + .maxRetries(embeddingModelProperties.getMaxRetries()) + .logRequests(embeddingModelProperties.getLogRequests()) + .logResponses(embeddingModelProperties.getLogResponses()) + .build(); + } +} \ No newline at end of file diff --git a/common/src/main/java/dev/langchain4j/qianfan/spring/ChatModelProperties.java b/common/src/main/java/dev/langchain4j/qianfan/spring/ChatModelProperties.java new file mode 100644 index 000000000..55870752c --- /dev/null +++ b/common/src/main/java/dev/langchain4j/qianfan/spring/ChatModelProperties.java @@ -0,0 +1,21 @@ +package dev.langchain4j.qianfan.spring; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +class ChatModelProperties { + private String baseUrl; + private String apiKey; + private String secretKey; + private Double temperature; + private Integer maxRetries; + private Double topP; + private String modelName; + private String endpoint; + private String responseFormat; + private Double penaltyScore; + private Boolean logRequests; + private Boolean logResponses; +} \ No newline at end of file diff --git a/common/src/main/java/dev/langchain4j/qianfan/spring/EmbeddingModelProperties.java b/common/src/main/java/dev/langchain4j/qianfan/spring/EmbeddingModelProperties.java new file mode 100644 index 000000000..89521d3ca --- /dev/null +++ b/common/src/main/java/dev/langchain4j/qianfan/spring/EmbeddingModelProperties.java @@ -0,0 +1,19 @@ +package dev.langchain4j.qianfan.spring; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +class EmbeddingModelProperties { + private String baseUrl; + private String apiKey; + private String secretKey; + private Integer maxRetries; + private String modelName; + private String endpoint; + private String user; + private Boolean logRequests; + private Boolean logResponses; + +} \ No newline at end of file diff --git a/common/src/main/java/dev/langchain4j/qianfan/spring/LanguageModelProperties.java b/common/src/main/java/dev/langchain4j/qianfan/spring/LanguageModelProperties.java new file mode 100644 index 000000000..e2dad2b4c --- /dev/null +++ b/common/src/main/java/dev/langchain4j/qianfan/spring/LanguageModelProperties.java @@ -0,0 +1,22 @@ +package dev.langchain4j.qianfan.spring; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +class LanguageModelProperties { + private String baseUrl; + private String apiKey; + private String secretKey; + private Double temperature; + private Integer maxRetries; + private Integer topK; + private Double topP; + private String modelName; + private String endpoint; + private Double penaltyScore; + private Boolean logRequests; + private Boolean logResponses; + +} \ No newline at end of file diff --git a/common/src/main/java/dev/langchain4j/qianfan/spring/Properties.java b/common/src/main/java/dev/langchain4j/qianfan/spring/Properties.java new file mode 100644 index 000000000..0ab2c5c5d --- /dev/null +++ b/common/src/main/java/dev/langchain4j/qianfan/spring/Properties.java @@ -0,0 +1,29 @@ +package dev.langchain4j.qianfan.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.qianfan"; + + @NestedConfigurationProperty + ChatModelProperties chatModel; + + @NestedConfigurationProperty + ChatModelProperties streamingChatModel; + + @NestedConfigurationProperty + LanguageModelProperties languageModel; + + @NestedConfigurationProperty + LanguageModelProperties streamingLanguageModel; + + @NestedConfigurationProperty + EmbeddingModelProperties embeddingModel; +} \ No newline at end of file diff --git a/launchers/standalone/src/main/java/com/tencent/supersonic/StandaloneLauncher.java b/launchers/standalone/src/main/java/com/tencent/supersonic/StandaloneLauncher.java index 60a8278f4..a6de486bd 100644 --- a/launchers/standalone/src/main/java/com/tencent/supersonic/StandaloneLauncher.java +++ b/launchers/standalone/src/main/java/com/tencent/supersonic/StandaloneLauncher.java @@ -8,7 +8,7 @@ import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import springfox.documentation.swagger2.annotations.EnableSwagger2; -@SpringBootApplication(scanBasePackages = {"com.tencent.supersonic", "dev.langchain4j.model"}, +@SpringBootApplication(scanBasePackages = {"com.tencent.supersonic", "dev.langchain4j"}, exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class}) @EnableScheduling @EnableAsync diff --git a/pom.xml b/pom.xml index c32c5fdb5..220104a0e 100644 --- a/pom.xml +++ b/pom.xml @@ -190,6 +190,16 @@ langchain4j-embeddings-all-minilm-l6-v2-q ${langchain4j.version} + + dev.langchain4j + langchain4j-qianfan + ${langchain4j.version} + + + org.springframework.boot + spring-boot-autoconfigure-processor + ${spring.version} +