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}
+