Browse Source

fix model dynamic config

gbhblt 1 year ago
parent
commit
af4dd5732a

+ 34 - 0
langchat-common/src/main/java/cn/tycoding/langchat/common/enums/ChatErrorEnum.java

@@ -0,0 +1,34 @@
+package cn.tycoding.langchat.common.enums;
+
+import lombok.AllArgsConstructor;
+
+/**
+ * @author GB
+ * @desc
+ * @since 2024-08-21
+ */
+@AllArgsConstructor
+public enum ChatErrorEnum {
+    API_KEY_IS_NULL(1000, "模型 %s %s api key 为空,请检查配置"),
+    BASE_URL_IS_NULL(1003, "模型 %s %s base url 为空,请检查配置"),
+    SECRET_KEY_IS_NULL(1005, "模型 %s %s base secret Key 为空,请检查配置"),
+    ;
+
+    /**
+     * 错误码
+     */
+    private int errorCode;
+    /**
+     * 错误描述,用于展示给用户
+     */
+    private String errorDesc;
+
+    public int getErrorCode() {
+        return this.errorCode;
+    }
+
+    public String getErrorDesc(String modelName, String type) {
+        return this.errorDesc.formatted(modelName, type);
+    }
+
+}

+ 4 - 25
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/ProviderInitialize.java

@@ -18,34 +18,15 @@ package cn.tycoding.langchat.core.provider;
 
 import cn.hutool.core.lang.Pair;
 import cn.hutool.core.util.ObjectUtil;
-import cn.hutool.core.util.StrUtil;
 import cn.tycoding.langchat.biz.component.ModelTypeEnum;
-import cn.tycoding.langchat.biz.component.ProviderEnum;
 import cn.tycoding.langchat.biz.entity.AigcModel;
 import cn.tycoding.langchat.biz.service.AigcModelService;
 import cn.tycoding.langchat.common.component.SpringContextHolder;
 import cn.tycoding.langchat.core.consts.EmbedConst;
 import cn.tycoding.langchat.core.provider.model.config.strategy.ModelConfigHandler;
-import dev.langchain4j.model.anthropic.AnthropicStreamingChatModel;
-import dev.langchain4j.model.azure.AzureOpenAiEmbeddingModel;
-import dev.langchain4j.model.azure.AzureOpenAiImageModel;
-import dev.langchain4j.model.azure.AzureOpenAiStreamingChatModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
-import dev.langchain4j.model.dashscope.QwenEmbeddingModel;
-import dev.langchain4j.model.dashscope.QwenStreamingChatModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
-import dev.langchain4j.model.ollama.OllamaEmbeddingModel;
-import dev.langchain4j.model.ollama.OllamaStreamingChatModel;
-import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
-import dev.langchain4j.model.openai.OpenAiImageModel;
-import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
-import dev.langchain4j.model.qianfan.QianfanEmbeddingModel;
-import dev.langchain4j.model.qianfan.QianfanStreamingChatModel;
-import dev.langchain4j.model.vertexai.VertexAiGeminiStreamingChatModel;
-import dev.langchain4j.model.zhipu.ZhipuAiEmbeddingModel;
-import dev.langchain4j.model.zhipu.ZhipuAiImageModel;
-import dev.langchain4j.model.zhipu.ZhipuAiStreamingChatModel;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeansException;
@@ -103,13 +84,13 @@ public class ProviderInitialize implements ApplicationContextAware {
                 return;
             }
             modelConfigHandlers.forEach(x -> {
-                StreamingChatLanguageModel streamingChatLanguageModel = x.chatConfig(model);
+                StreamingChatLanguageModel streamingChatLanguageModel = x.buildStreamingChat(model);
                 if (ObjectUtil.isNotEmpty(streamingChatLanguageModel)) {
                     contextHolder.registerBean(model.getId(), streamingChatLanguageModel);
                 }
             });
         } catch (Exception e) {
-            log.error("model 【id{} name{}】 chat 配置报错", model.getId(), model.getName());
+            log.error("model 【 id: {} name: {}】streaming chat 配置报错", model.getId(), model.getName());
         }
 
     }
@@ -121,7 +102,7 @@ public class ProviderInitialize implements ApplicationContextAware {
                 return;
             }
             modelConfigHandlers.forEach(x -> {
-                Pair<String, DimensionAwareEmbeddingModel> embeddingModelPair = x.embeddingConfig(model);
+                Pair<String, DimensionAwareEmbeddingModel> embeddingModelPair = x.buildEmbedding(model);
                 if (ObjectUtil.isNotEmpty(embeddingModelPair)) {
                     contextHolder.registerBean(embeddingModelPair.getKey(), embeddingModelPair.getValue());
                 }
@@ -130,7 +111,6 @@ public class ProviderInitialize implements ApplicationContextAware {
         } catch (Exception e) {
             log.error("model 【id{} name{}】 embedding 配置报错", model.getId(), model.getName());
         }
-
     }
 
     private void imageHandler(AigcModel model) {
@@ -140,7 +120,7 @@ public class ProviderInitialize implements ApplicationContextAware {
                 return;
             }
             modelConfigHandlers.forEach(x -> {
-                ImageModel imageModel = x.imageConfig(model);
+                ImageModel imageModel = x.buildImage(model);
                 if (ObjectUtil.isNotEmpty(imageModel)) {
                     contextHolder.registerBean(model.getId(), imageModel);
                 }
@@ -148,6 +128,5 @@ public class ProviderInitialize implements ApplicationContextAware {
         } catch (Exception e) {
             log.error("model 【id{} name{}】 image 配置报错", model.getId(), model.getName());
         }
-
     }
 }

+ 62 - 24
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/model/config/strategy/AzureOenAIModelConfigHandler.java

@@ -4,10 +4,14 @@ import cn.hutool.core.lang.Pair;
 import cn.hutool.core.util.StrUtil;
 import cn.tycoding.langchat.biz.component.ProviderEnum;
 import cn.tycoding.langchat.biz.entity.AigcModel;
+import cn.tycoding.langchat.common.enums.ChatErrorEnum;
+import cn.tycoding.langchat.common.exception.ServiceException;
 import cn.tycoding.langchat.core.consts.EmbedConst;
+import dev.langchain4j.model.azure.AzureOpenAiChatModel;
 import dev.langchain4j.model.azure.AzureOpenAiEmbeddingModel;
 import dev.langchain4j.model.azure.AzureOpenAiImageModel;
 import dev.langchain4j.model.azure.AzureOpenAiStreamingChatModel;
+import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
@@ -17,11 +21,11 @@ import org.springframework.stereotype.Component;
 /**
  * @author GB
  * @desc
- * @since  2024-08-19 10:08
+ * @since 2024-08-19 10:08
  */
 @Slf4j
 @Component
-public class AzureOenAIModelConfigHandler implements ModelConfigHandler{
+public class AzureOenAIModelConfigHandler implements ModelConfigHandler {
     @Override
     public boolean whetherCurrentModel(AigcModel model) {
         return ProviderEnum.AZURE_OPENAI.name().equals(model.getProvider());
@@ -33,14 +37,14 @@ public class AzureOenAIModelConfigHandler implements ModelConfigHandler{
     }
 
     @Override
-    public StreamingChatLanguageModel chatConfig(AigcModel model) {
-        try{
-            if(!whetherCurrentModel(model)){
+    public StreamingChatLanguageModel buildStreamingChat(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.info("Azure OpenAi 配置信息有误");
-                return null;
+            if (!basicCheck(model)) {
+                throw new ServiceException(ChatErrorEnum.API_KEY_IS_NULL.getErrorCode(),
+                        ChatErrorEnum.API_KEY_IS_NULL.getErrorDesc(ProviderEnum.AZURE_OPENAI.name(), model.getType()));
             }
             return AzureOpenAiStreamingChatModel
                     .builder()
@@ -52,21 +56,52 @@ public class AzureOenAIModelConfigHandler implements ModelConfigHandler{
                     .logRequestsAndResponses(true)
                     .topP(model.getTopP())
                     .build();
-        }catch (Exception e){
-         log.error("AzureOenAI chat 配置报错",e);
-         return null;
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("AzureOenAI chat 配置报错", e);
+            return null;
         }
     }
 
     @Override
-    public Pair<String, DimensionAwareEmbeddingModel> embeddingConfig(AigcModel model) {
-        try{
-            if(!whetherCurrentModel(model)){
+    public ChatLanguageModel buildChatLanguageModel(AigcModel model) {
+        if (!whetherCurrentModel(model)) {
+            return null;
+        }
+        if (!basicCheck(model)) {
+            throw new ServiceException(ChatErrorEnum.API_KEY_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.API_KEY_IS_NULL.getErrorDesc(ProviderEnum.AZURE_OPENAI.name(), model.getType()));
+        }
+        try {
+            return AzureOpenAiChatModel.builder()
+                    .apiKey(model.getApiKey())
+                    .endpoint(model.getEndpoint())
+                    .deploymentName(model.getAzureDeploymentName())
+                    .maxTokens(model.getResponseLimit())
+                    .temperature(model.getTemperature())
+                    .logRequestsAndResponses(true)
+                    .topP(model.getTopP()).build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("AzureOenAI chat 配置报错", e);
+            return null;
+        }
+
+    }
+
+    @Override
+    public Pair<String, DimensionAwareEmbeddingModel> buildEmbedding(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.info("Azure OpenAi 配置信息有误");
-                return null;
+            if (!basicCheck(model)) {
+                throw new ServiceException(ChatErrorEnum.API_KEY_IS_NULL.getErrorCode(),
+                        ChatErrorEnum.API_KEY_IS_NULL.getErrorDesc(ProviderEnum.AZURE_OPENAI.name(), model.getType()));
             }
             AzureOpenAiEmbeddingModel openAiEmbeddingModel = AzureOpenAiEmbeddingModel
                     .builder()
@@ -74,22 +109,25 @@ public class AzureOenAIModelConfigHandler implements ModelConfigHandler{
                     .deploymentName(model.getBaseUrl())
                     .logRequestsAndResponses(true)
                     .build();
-            return Pair.of(EmbedConst.CLAZZ_NAME_AZURE_OPENAI,openAiEmbeddingModel);
-        }catch (Exception e){
+            return Pair.of(EmbedConst.CLAZZ_NAME_AZURE_OPENAI, openAiEmbeddingModel);
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
             log.error("AzureOenAI embedding 配置报错", e);
             return null;
         }
     }
 
     @Override
-    public ImageModel imageConfig(AigcModel model) {
+    public ImageModel buildImage(AigcModel model) {
         try {
-            if(!whetherCurrentModel(model)){
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.info("Azure OpenAi 配置信息有误");
-                return null;
+            if (!basicCheck(model)) {
+                throw new ServiceException(ChatErrorEnum.API_KEY_IS_NULL.getErrorCode(),
+                        ChatErrorEnum.API_KEY_IS_NULL.getErrorDesc(ProviderEnum.AZURE_OPENAI.name(), model.getType()));
             }
             return AzureOpenAiImageModel
                     .builder()

+ 74 - 27
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/model/config/strategy/ClaudeModelConfigHandler.java

@@ -3,7 +3,11 @@ package cn.tycoding.langchat.core.provider.model.config.strategy;
 import cn.hutool.core.lang.Pair;
 import cn.tycoding.langchat.biz.component.ProviderEnum;
 import cn.tycoding.langchat.biz.entity.AigcModel;
+import cn.tycoding.langchat.common.enums.ChatErrorEnum;
+import cn.tycoding.langchat.common.exception.ServiceException;
+import dev.langchain4j.model.anthropic.AnthropicChatModel;
 import dev.langchain4j.model.anthropic.AnthropicStreamingChatModel;
+import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
@@ -13,11 +17,11 @@ import org.springframework.stereotype.Component;
 /**
  * @author GB
  * @desc
- * @since  2024-08-19 10:08
+ * @since 2024-08-19 10:08
  */
 @Slf4j
 @Component
-public class ClaudeModelConfigHandler implements ModelConfigHandler{
+public class ClaudeModelConfigHandler implements ModelConfigHandler {
     @Override
     public boolean whetherCurrentModel(AigcModel model) {
         return ProviderEnum.CLAUDE.name().equals(model.getProvider());
@@ -25,27 +29,26 @@ public class ClaudeModelConfigHandler implements ModelConfigHandler{
 
     @Override
     public boolean basicCheck(AigcModel model) {
-        String baseUrl = model.getBaseUrl();
-        if (baseUrl == null) {
-            log.error("Base URL 为空");
-            return false;
-        }
-        if (!baseUrl.endsWith("/")) {
-            model.setBaseUrl(baseUrl + "/");
+        if (model.getBaseUrl() == null) {
+            throw new ServiceException(ChatErrorEnum.BASE_URL_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.BASE_URL_IS_NULL.getErrorDesc(ProviderEnum.CLAUDE.name(), model.getType()));
         }
+
         return true;
     }
 
     @Override
-    public StreamingChatLanguageModel chatConfig(AigcModel model) {
-        try{
-            if(!whetherCurrentModel(model)){
+    public StreamingChatLanguageModel buildStreamingChat(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.error("claude 配置信息有误");
+            if (!basicCheck(model)) {
                 return null;
             }
+            if (!model.getBaseUrl().endsWith("/")) {
+                model.setBaseUrl(model.getBaseUrl() + "/");
+            }
             return AnthropicStreamingChatModel
                     .builder()
                     .apiKey(model.getApiKey())
@@ -56,41 +59,85 @@ public class ClaudeModelConfigHandler implements ModelConfigHandler{
                     .logRequests(true)
                     .logResponses(true)
                     .build();
-        }catch(Exception e){
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
             log.error("Claude chat 配置报错", e);
             return null;
         }
     }
 
     @Override
-    public Pair<String, DimensionAwareEmbeddingModel> embeddingConfig(AigcModel model) {
-        try{
-            if(!whetherCurrentModel(model)){
+    public ChatLanguageModel buildChatLanguageModel(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.error("claude 配置信息有误");
+            if (!basicCheck(model)) {
                 return null;
             }
+            if (!model.getBaseUrl().endsWith("/")) {
+                model.setBaseUrl(model.getBaseUrl() + "/");
+            }
+            return AnthropicChatModel
+                    .builder()
+                    .apiKey(model.getApiKey())
+                    .baseUrl(model.getBaseUrl())
+                    .modelName(model.getModel())
+                    .temperature(model.getTemperature())
+                    .topP(model.getTopP())
+                    .logRequests(true)
+                    .logResponses(true)
+                    .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("Claude chat 配置报错", e);
+            return null;
+        }
+    }
+
+    @Override
+    public Pair<String, DimensionAwareEmbeddingModel> buildEmbedding(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
+                return null;
+            }
+            if (!basicCheck(model)) {
+                return null;
+            }
+            if (!model.getBaseUrl().endsWith("/")) {
+                model.setBaseUrl(model.getBaseUrl() + "/");
+            }
             return null;
-        }catch (Exception e){
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
             log.error("Claude embedding 配置报错", e);
             return null;
         }
     }
 
     @Override
-    public ImageModel imageConfig(AigcModel model) {
-        try{
-            if(!whetherCurrentModel(model)){
+    public ImageModel buildImage(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.error("claude 配置信息有误");
+            if (!basicCheck(model)) {
                 return null;
             }
+            if (!model.getBaseUrl().endsWith("/")) {
+                model.setBaseUrl(model.getBaseUrl() + "/");
+            }
             return null;
-        }catch (Exception e){
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
             log.error("Claude image 配置报错", e);
             return null;
         }

+ 53 - 6
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/model/config/strategy/GeminiModelConfigHandler.java

@@ -4,9 +4,13 @@ import cn.hutool.core.lang.Pair;
 import cn.hutool.core.util.StrUtil;
 import cn.tycoding.langchat.biz.component.ProviderEnum;
 import cn.tycoding.langchat.biz.entity.AigcModel;
+import cn.tycoding.langchat.common.enums.ChatErrorEnum;
+import cn.tycoding.langchat.common.exception.ServiceException;
+import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
+import dev.langchain4j.model.vertexai.VertexAiGeminiChatModel;
 import dev.langchain4j.model.vertexai.VertexAiGeminiStreamingChatModel;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
@@ -26,17 +30,24 @@ public class GeminiModelConfigHandler implements ModelConfigHandler {
 
     @Override
     public boolean basicCheck(AigcModel model) {
+        if (!StrUtil.isBlank(model.getApiKey())) {
+            throw new ServiceException(ChatErrorEnum.API_KEY_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.BASE_URL_IS_NULL.getErrorDesc(ProviderEnum.GEMINI.name(), model.getType()));
+        }
+        if (!StrUtil.isBlank(model.getSecretKey())) {
+            throw new ServiceException(ChatErrorEnum.SECRET_KEY_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.SECRET_KEY_IS_NULL.getErrorDesc(ProviderEnum.GEMINI.name(), model.getType()));
+        }
         return !StrUtil.isBlank(model.getApiKey()) && !StrUtil.isBlank(model.getSecretKey());
     }
 
     @Override
-    public StreamingChatLanguageModel chatConfig(AigcModel model) {
+    public StreamingChatLanguageModel buildStreamingChat(AigcModel model) {
         try {
             if(!whetherCurrentModel(model)){
                 return null;
             }
             if (!basicCheck(model)) {
-                log.info("Gemini 配置信息有误,无法加载");
                 return null;
             }
             return VertexAiGeminiStreamingChatModel
@@ -50,6 +61,9 @@ public class GeminiModelConfigHandler implements ModelConfigHandler {
                     .logResponses(true)
                     .topP(Float.parseFloat(model.getTopP().toString()))
                     .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("Gemini 配置报错", e);
             return null;
@@ -57,16 +71,47 @@ public class GeminiModelConfigHandler implements ModelConfigHandler {
     }
 
     @Override
-    public Pair<String, DimensionAwareEmbeddingModel> embeddingConfig(AigcModel model) {
+    public ChatLanguageModel buildChatLanguageModel(AigcModel model) {
         try {
             if(!whetherCurrentModel(model)){
                 return null;
             }
             if (!basicCheck(model)) {
-                log.info("Gemini 配置信息有误,无法加载");
+                return null;
+            }
+            return VertexAiGeminiChatModel
+                    .builder()
+                    .project(model.getGeminiProject())
+                    .location(model.getGeminiLocation())
+                    .modelName(model.getModel())
+                    .temperature(Float.parseFloat(model.getTemperature().toString()))
+                    .maxOutputTokens(model.getResponseLimit())
+                    .logRequests(true)
+                    .logResponses(true)
+                    .topP(Float.parseFloat(model.getTopP().toString()))
+                    .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("Gemini 配置报错", e);
+            return null;
+        }
+    }
+
+    @Override
+    public Pair<String, DimensionAwareEmbeddingModel> buildEmbedding(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
+                return null;
+            }
+            if (!basicCheck(model)) {
                 return null;
             }
             return null;
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             return null;
         }
@@ -74,16 +119,18 @@ public class GeminiModelConfigHandler implements ModelConfigHandler {
     }
 
     @Override
-    public ImageModel imageConfig(AigcModel model) {
+    public ImageModel buildImage(AigcModel model) {
         try {
             if(!whetherCurrentModel(model)){
                 return null;
             }
             if (!basicCheck(model)) {
-                log.info("Gemini 配置信息有误,无法加载");
                 return null;
             }
             return null;
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             return null;
         }

+ 7 - 4
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/model/config/strategy/ModelConfigHandler.java

@@ -2,6 +2,7 @@ package cn.tycoding.langchat.core.provider.model.config.strategy;
 
 import cn.hutool.core.lang.Pair;
 import cn.tycoding.langchat.biz.entity.AigcModel;
+import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
@@ -28,12 +29,14 @@ public interface ModelConfigHandler {
 
 
     /**
-     * chat config
+     * streaming chat config
      *
      * @param model
      * @return
      */
-    StreamingChatLanguageModel chatConfig(AigcModel model);
+    StreamingChatLanguageModel buildStreamingChat(AigcModel model);
+
+    ChatLanguageModel buildChatLanguageModel(AigcModel model);
 
     /**
      * embedding config
@@ -41,7 +44,7 @@ public interface ModelConfigHandler {
      * @param model
      * @return
      */
-    Pair<String, DimensionAwareEmbeddingModel> embeddingConfig(AigcModel model);
+    Pair<String, DimensionAwareEmbeddingModel> buildEmbedding(AigcModel model);
 
     /**
      * image config
@@ -49,7 +52,7 @@ public interface ModelConfigHandler {
      * @param model
      * @return
      */
-    ImageModel imageConfig(AigcModel model);
+    ImageModel buildImage(AigcModel model);
 
 
 }

+ 47 - 9
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/model/config/strategy/OenAIModelConfigHandler.java

@@ -4,10 +4,14 @@ import cn.hutool.core.lang.Pair;
 import cn.hutool.core.util.StrUtil;
 import cn.tycoding.langchat.biz.component.ProviderEnum;
 import cn.tycoding.langchat.biz.entity.AigcModel;
+import cn.tycoding.langchat.common.enums.ChatErrorEnum;
+import cn.tycoding.langchat.common.exception.ServiceException;
 import cn.tycoding.langchat.core.consts.EmbedConst;
+import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
+import dev.langchain4j.model.openai.OpenAiChatModel;
 import dev.langchain4j.model.openai.OpenAiEmbeddingModel;
 import dev.langchain4j.model.openai.OpenAiImageModel;
 import dev.langchain4j.model.openai.OpenAiStreamingChatModel;
@@ -29,20 +33,19 @@ public class OenAIModelConfigHandler implements ModelConfigHandler{
     public boolean basicCheck(AigcModel model) {
         String apiKey = model.getApiKey();
         if (StrUtil.isBlank(apiKey)) {
-            log.error("openai apikey is null");
-            return false;
+            throw new ServiceException(ChatErrorEnum.API_KEY_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.API_KEY_IS_NULL.getErrorDesc(ProviderEnum.OPENAI.name(), model.getType()));
         }
         return true;
     }
 
     @Override
-    public StreamingChatLanguageModel chatConfig(AigcModel model) {
+    public StreamingChatLanguageModel buildStreamingChat(AigcModel model) {
         try {
             if(!whetherCurrentModel(model)){
                 return null;
             }
             if (!basicCheck(model)) {
-                log.error("openai 配置信息有误");
                 return null;
             }
             return OpenAiStreamingChatModel
@@ -56,21 +59,51 @@ public class OenAIModelConfigHandler implements ModelConfigHandler{
                     .logResponses(true)
                     .topP(model.getTopP())
                     .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("openai chat 模型配置报错", e);
             return null;
         }
+    }
 
+    @Override
+    public ChatLanguageModel buildChatLanguageModel(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
+                return null;
+            }
+            if (!basicCheck(model)) {
+                return null;
+            }
+            return OpenAiChatModel
+                    .builder()
+                    .apiKey(model.getApiKey())
+                    .baseUrl(model.getBaseUrl())
+                    .modelName(model.getModel())
+                    .maxTokens(model.getResponseLimit())
+                    .temperature(model.getTemperature())
+                    .logRequests(true)
+                    .logResponses(true)
+                    .topP(model.getTopP())
+                    .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("openai chat 模型配置报错", e);
+            return null;
+        }
     }
 
     @Override
-    public Pair<String, DimensionAwareEmbeddingModel> embeddingConfig(AigcModel model) {
+    public Pair<String, DimensionAwareEmbeddingModel> buildEmbedding(AigcModel model) {
         try {
-            if(!whetherCurrentModel(model)){
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
             if (!basicCheck(model)) {
-                log.error("openai 配置信息有误");
                 return null;
             }
             OpenAiEmbeddingModel openAiEmbeddingModel = OpenAiEmbeddingModel
@@ -83,6 +116,9 @@ public class OenAIModelConfigHandler implements ModelConfigHandler{
                     .logResponses(true)
                     .build();
             return Pair.of(EmbedConst.CLAZZ_NAME_OPENAI,openAiEmbeddingModel);
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("openai embedding 模型配置报错", e);
             return null;
@@ -90,13 +126,12 @@ public class OenAIModelConfigHandler implements ModelConfigHandler{
     }
 
     @Override
-    public ImageModel imageConfig(AigcModel model) {
+    public ImageModel buildImage(AigcModel model) {
         try {
             if(!whetherCurrentModel(model)){
                 return null;
             }
             if (!basicCheck(model)) {
-                log.error("openai 配置信息有误");
                 return null;
             }
             return OpenAiImageModel
@@ -110,6 +145,9 @@ public class OenAIModelConfigHandler implements ModelConfigHandler{
                     .logRequests(true)
                     .logResponses(true)
                     .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("openai image 模型配置报错", e);
             return null;

+ 57 - 15
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/model/config/strategy/OllamaModelConfigHandler.java

@@ -3,13 +3,18 @@ package cn.tycoding.langchat.core.provider.model.config.strategy;
 import cn.hutool.core.lang.Pair;
 import cn.tycoding.langchat.biz.component.ProviderEnum;
 import cn.tycoding.langchat.biz.entity.AigcModel;
+import cn.tycoding.langchat.common.enums.ChatErrorEnum;
+import cn.tycoding.langchat.common.exception.ServiceException;
 import cn.tycoding.langchat.core.consts.EmbedConst;
+import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
+import dev.langchain4j.model.ollama.OllamaChatModel;
 import dev.langchain4j.model.ollama.OllamaEmbeddingModel;
 import dev.langchain4j.model.ollama.OllamaStreamingChatModel;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 /**
@@ -19,7 +24,7 @@ import org.springframework.stereotype.Component;
  */
 @Slf4j
 @Component
-public class OllamaModelConfigHandler implements ModelConfigHandler{
+public class OllamaModelConfigHandler implements ModelConfigHandler {
     @Override
     public boolean whetherCurrentModel(AigcModel model) {
         return ProviderEnum.OLLAMA.name().equals(model.getProvider());
@@ -27,17 +32,20 @@ public class OllamaModelConfigHandler implements ModelConfigHandler{
 
     @Override
     public boolean basicCheck(AigcModel model) {
+        if (StringUtils.isBlank(model.getBaseUrl())) {
+            throw new ServiceException(ChatErrorEnum.BASE_URL_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.BASE_URL_IS_NULL.getErrorDesc(ProviderEnum.OLLAMA.name(), model.getType()));
+        }
         return true;
     }
 
     @Override
-    public StreamingChatLanguageModel chatConfig(AigcModel model) {
-        try{
-            if(!whetherCurrentModel(model)){
+    public StreamingChatLanguageModel buildStreamingChat(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.error("Ollama embedding 配置信息有误");
+            if (!basicCheck(model)) {
                 return null;
             }
             return OllamaStreamingChatModel
@@ -49,20 +57,49 @@ public class OllamaModelConfigHandler implements ModelConfigHandler{
                     .logRequests(true)
                     .logResponses(true)
                     .build();
-        }catch (Exception e){
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("Ollama streaming chat 配置报错", e);
+            return null;
+        }
+    }
+
+    @Override
+    public ChatLanguageModel buildChatLanguageModel(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
+                return null;
+            }
+            if (!basicCheck(model)) {
+                return null;
+            }
+            return OllamaChatModel
+                    .builder()
+                    .baseUrl(model.getBaseUrl())
+                    .modelName(model.getModel())
+                    .temperature(model.getTemperature())
+                    .topP(model.getTopP())
+                    .logRequests(true)
+                    .logResponses(true)
+                    .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
             log.error("Ollama chat 配置报错", e);
             return null;
         }
     }
 
     @Override
-    public Pair<String, DimensionAwareEmbeddingModel> embeddingConfig(AigcModel model) {
+    public Pair<String, DimensionAwareEmbeddingModel> buildEmbedding(AigcModel model) {
         try {
-            if(!whetherCurrentModel(model)){
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.error("Ollama embedding 配置信息有误");
+            if (!basicCheck(model)) {
                 return null;
             }
             OllamaEmbeddingModel ollamaEmbeddingModel = OllamaEmbeddingModel
@@ -73,6 +110,9 @@ public class OllamaModelConfigHandler implements ModelConfigHandler{
                     .logResponses(true)
                     .build();
             return Pair.of(EmbedConst.CLAZZ_NAME_OLLAMA, ollamaEmbeddingModel);
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("Ollama embedding 配置报错", e);
             return null;
@@ -80,16 +120,18 @@ public class OllamaModelConfigHandler implements ModelConfigHandler{
     }
 
     @Override
-    public ImageModel imageConfig(AigcModel model) {
+    public ImageModel buildImage(AigcModel model) {
         try {
-            if(!whetherCurrentModel(model)){
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.error("Ollama embedding 配置信息有误");
+            if (!basicCheck(model)) {
                 return null;
             }
             return null;
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("Ollama image 配置报错", e);
             return null;

+ 55 - 6
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/model/config/strategy/QFanModelConfigHandler.java

@@ -3,13 +3,18 @@ package cn.tycoding.langchat.core.provider.model.config.strategy;
 import cn.hutool.core.lang.Pair;
 import cn.tycoding.langchat.biz.component.ProviderEnum;
 import cn.tycoding.langchat.biz.entity.AigcModel;
+import cn.tycoding.langchat.common.enums.ChatErrorEnum;
+import cn.tycoding.langchat.common.exception.ServiceException;
 import cn.tycoding.langchat.core.consts.EmbedConst;
+import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
+import dev.langchain4j.model.qianfan.QianfanChatModel;
 import dev.langchain4j.model.qianfan.QianfanEmbeddingModel;
 import dev.langchain4j.model.qianfan.QianfanStreamingChatModel;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 /**
@@ -27,17 +32,24 @@ public class QFanModelConfigHandler implements ModelConfigHandler {
 
     @Override
     public boolean basicCheck(AigcModel model) {
+        if (StringUtils.isBlank(model.getApiKey())) {
+            throw new ServiceException(ChatErrorEnum.API_KEY_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.API_KEY_IS_NULL.getErrorDesc(ProviderEnum.Q_FAN.name(), model.getType()));
+        }
+        if (StringUtils.isBlank(model.getSecretKey())) {
+            throw new ServiceException(ChatErrorEnum.SECRET_KEY_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.SECRET_KEY_IS_NULL.getErrorDesc(ProviderEnum.Q_FAN.name(), model.getType()));
+        }
         return true;
     }
 
     @Override
-    public StreamingChatLanguageModel chatConfig(AigcModel model) {
+    public StreamingChatLanguageModel buildStreamingChat(AigcModel model) {
         try {
             if (!whetherCurrentModel(model)) {
                 return null;
             }
             if (!basicCheck(model)) {
-                log.error("qiafan  配置信息有误");
                 return null;
             }
             return QianfanStreamingChatModel
@@ -51,21 +63,53 @@ public class QFanModelConfigHandler implements ModelConfigHandler {
                     .logRequests(true)
                     .logResponses(true)
                     .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("Qianfan  streaming chat 配置报错", e);
+            return null;
+        }
+    }
 
+    @Override
+    public ChatLanguageModel buildChatLanguageModel(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
+                return null;
+            }
+            if (!basicCheck(model)) {
+                return null;
+            }
+            return QianfanChatModel
+                    .builder()
+                    .apiKey(model.getApiKey())
+                    .secretKey(model.getSecretKey())
+                    .modelName(model.getModel())
+                    .baseUrl(model.getBaseUrl())
+                    .temperature(model.getTemperature())
+                    .topP(model.getTopP())
+                    .logRequests(true)
+                    .logResponses(true)
+                    .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("Qianfan chat 配置报错", e);
             return null;
         }
+
+
     }
 
     @Override
-    public Pair<String, DimensionAwareEmbeddingModel> embeddingConfig(AigcModel model) {
+    public Pair<String, DimensionAwareEmbeddingModel> buildEmbedding(AigcModel model) {
         try {
             if (!whetherCurrentModel(model)) {
                 return null;
             }
             if (!basicCheck(model)) {
-                log.error("qiafan  配置信息有误");
                 return null;
             }
             QianfanEmbeddingModel qianfanEmbeddingModel = QianfanEmbeddingModel
@@ -77,6 +121,9 @@ public class QFanModelConfigHandler implements ModelConfigHandler {
                     .logResponses(true)
                     .build();
             return Pair.of(EmbedConst.CLAZZ_NAME_QIANFAN, qianfanEmbeddingModel);
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("Qianfan embedding 配置报错", e);
             return null;
@@ -84,16 +131,18 @@ public class QFanModelConfigHandler implements ModelConfigHandler {
     }
 
     @Override
-    public ImageModel imageConfig(AigcModel model) {
+    public ImageModel buildImage(AigcModel model) {
         try {
             if (!whetherCurrentModel(model)) {
                 return null;
             }
             if (!basicCheck(model)) {
-                log.error("qiafan  配置信息有误");
                 return null;
             }
             return null;
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("Qianfan image 配置报错", e);
             return null;

+ 49 - 7
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/model/config/strategy/QWenModelConfigHandler.java

@@ -3,13 +3,18 @@ package cn.tycoding.langchat.core.provider.model.config.strategy;
 import cn.hutool.core.lang.Pair;
 import cn.tycoding.langchat.biz.component.ProviderEnum;
 import cn.tycoding.langchat.biz.entity.AigcModel;
+import cn.tycoding.langchat.common.enums.ChatErrorEnum;
+import cn.tycoding.langchat.common.exception.ServiceException;
 import cn.tycoding.langchat.core.consts.EmbedConst;
+import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
+import dev.langchain4j.model.dashscope.QwenChatModel;
 import dev.langchain4j.model.dashscope.QwenEmbeddingModel;
 import dev.langchain4j.model.dashscope.QwenStreamingChatModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 /**
@@ -27,20 +32,50 @@ public class QWenModelConfigHandler implements ModelConfigHandler {
 
     @Override
     public boolean basicCheck(AigcModel model) {
+        if (StringUtils.isBlank(model.getApiKey())) {
+            throw new ServiceException(ChatErrorEnum.API_KEY_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.API_KEY_IS_NULL.getErrorDesc(ProviderEnum.Q_WEN.name(), model.getType()));
+        }
         return true;
     }
 
     @Override
-    public StreamingChatLanguageModel chatConfig(AigcModel model) {
+    public StreamingChatLanguageModel buildStreamingChat(AigcModel model) {
+        if (!whetherCurrentModel(model)) {
+            return null;
+        }
+        if (!basicCheck(model)) {
+            return null;
+        }
+        try {
+            return QwenStreamingChatModel
+                    .builder()
+                    .apiKey(model.getApiKey())
+                    .modelName(model.getModel())
+                    .baseUrl(model.getBaseUrl())
+                    .maxTokens(model.getResponseLimit())
+                    .temperature(Float.parseFloat(model.getTemperature().toString()))
+                    .topP(model.getTopP())
+                    .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("qian wen streaming chat 配置报错", e);
+            return null;
+        }
+    }
+
+    @Override
+    public ChatLanguageModel buildChatLanguageModel(AigcModel model) {
         try {
             if (!whetherCurrentModel(model)) {
                 return null;
             }
             if (!basicCheck(model)) {
-                log.error("qianwen  配置信息有误");
                 return null;
             }
-            return QwenStreamingChatModel
+            return QwenChatModel
                     .builder()
                     .apiKey(model.getApiKey())
                     .modelName(model.getModel())
@@ -49,6 +84,9 @@ public class QWenModelConfigHandler implements ModelConfigHandler {
                     .temperature(Float.parseFloat(model.getTemperature().toString()))
                     .topP(model.getTopP())
                     .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("qian wen chat 配置报错", e);
             return null;
@@ -56,13 +94,12 @@ public class QWenModelConfigHandler implements ModelConfigHandler {
     }
 
     @Override
-    public Pair<String, DimensionAwareEmbeddingModel> embeddingConfig(AigcModel model) {
+    public Pair<String, DimensionAwareEmbeddingModel> buildEmbedding(AigcModel model) {
         try {
             if (!whetherCurrentModel(model)) {
                 return null;
             }
             if (!basicCheck(model)) {
-                log.error("qianwen  配置信息有误");
                 return null;
             }
             QwenEmbeddingModel qwenEmbeddingModel = QwenEmbeddingModel
@@ -71,6 +108,9 @@ public class QWenModelConfigHandler implements ModelConfigHandler {
                     .modelName(model.getModel())
                     .build();
             return Pair.of(EmbedConst.CLAZZ_NAME_QIANWEN, qwenEmbeddingModel);
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("qian wen embedding 配置报错", e);
             return null;
@@ -78,16 +118,18 @@ public class QWenModelConfigHandler implements ModelConfigHandler {
     }
 
     @Override
-    public ImageModel imageConfig(AigcModel model) {
+    public ImageModel buildImage(AigcModel model) {
         try {
             if (!whetherCurrentModel(model)) {
                 return null;
             }
             if (!basicCheck(model)) {
-                log.error("qianwen  配置信息有误");
                 return null;
             }
             return null;
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
         } catch (Exception e) {
             log.error("qian wen image 配置报错", e);
             return null;

+ 69 - 20
langchat-core/src/main/java/cn/tycoding/langchat/core/provider/model/config/strategy/ZhiPuModelConfigHandler.java

@@ -3,14 +3,19 @@ package cn.tycoding.langchat.core.provider.model.config.strategy;
 import cn.hutool.core.lang.Pair;
 import cn.tycoding.langchat.biz.component.ProviderEnum;
 import cn.tycoding.langchat.biz.entity.AigcModel;
+import cn.tycoding.langchat.common.enums.ChatErrorEnum;
+import cn.tycoding.langchat.common.exception.ServiceException;
 import cn.tycoding.langchat.core.consts.EmbedConst;
+import dev.langchain4j.model.chat.ChatLanguageModel;
 import dev.langchain4j.model.chat.StreamingChatLanguageModel;
 import dev.langchain4j.model.embedding.DimensionAwareEmbeddingModel;
 import dev.langchain4j.model.image.ImageModel;
+import dev.langchain4j.model.zhipu.ZhipuAiChatModel;
 import dev.langchain4j.model.zhipu.ZhipuAiEmbeddingModel;
 import dev.langchain4j.model.zhipu.ZhipuAiImageModel;
 import dev.langchain4j.model.zhipu.ZhipuAiStreamingChatModel;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 /**
@@ -20,7 +25,7 @@ import org.springframework.stereotype.Component;
  */
 @Slf4j
 @Component
-public class ZhiPuModelConfigHandler implements ModelConfigHandler{
+public class ZhiPuModelConfigHandler implements ModelConfigHandler {
     @Override
     public boolean whetherCurrentModel(AigcModel model) {
         return ProviderEnum.ZHIPU.name().equals(model.getProvider());
@@ -28,17 +33,24 @@ public class ZhiPuModelConfigHandler implements ModelConfigHandler{
 
     @Override
     public boolean basicCheck(AigcModel model) {
+        if (StringUtils.isBlank(model.getBaseUrl())) {
+            throw new ServiceException(ChatErrorEnum.BASE_URL_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.BASE_URL_IS_NULL.getErrorDesc(ProviderEnum.ZHIPU.name(), model.getType()));
+        }
+        if (StringUtils.isBlank(model.getApiKey())) {
+            throw new ServiceException(ChatErrorEnum.API_KEY_IS_NULL.getErrorCode(),
+                    ChatErrorEnum.API_KEY_IS_NULL.getErrorDesc(ProviderEnum.ZHIPU.name(), model.getType()));
+        }
         return true;
     }
 
     @Override
-    public StreamingChatLanguageModel chatConfig(AigcModel model) {
-        try{
-            if(!whetherCurrentModel(model)){
+    public StreamingChatLanguageModel buildStreamingChat(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.error("zhipu 配置信息有误");
+            if (!basicCheck(model)) {
                 return null;
             }
             return ZhipuAiStreamingChatModel
@@ -52,7 +64,40 @@ public class ZhiPuModelConfigHandler implements ModelConfigHandler{
                     .logRequests(true)
                     .logResponses(true)
                     .build();
-        }catch(Exception e){
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
+            log.error("zhipu streaming chat 配置报错", e);
+            return null;
+        }
+
+    }
+
+    @Override
+    public ChatLanguageModel buildChatLanguageModel(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
+                return null;
+            }
+            if (!basicCheck(model)) {
+                return null;
+            }
+            return ZhipuAiChatModel
+                    .builder()
+                    .apiKey(model.getApiKey())
+                    .baseUrl(model.getBaseUrl())
+                    .model(model.getModel())
+                    .maxToken(model.getResponseLimit())
+                    .temperature(model.getTemperature())
+                    .topP(model.getTopP())
+                    .logRequests(true)
+                    .logResponses(true)
+                    .build();
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
             log.error("zhipu chat 配置报错", e);
             return null;
         }
@@ -60,13 +105,12 @@ public class ZhiPuModelConfigHandler implements ModelConfigHandler{
     }
 
     @Override
-    public Pair<String, DimensionAwareEmbeddingModel> embeddingConfig(AigcModel model) {
-        try{
-            if(!whetherCurrentModel(model)){
+    public Pair<String, DimensionAwareEmbeddingModel> buildEmbedding(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.error("zhipu 配置信息有误");
+            if (!basicCheck(model)) {
                 return null;
             }
             ZhipuAiEmbeddingModel zhipuAiEmbeddingModel = ZhipuAiEmbeddingModel
@@ -78,23 +122,25 @@ public class ZhiPuModelConfigHandler implements ModelConfigHandler{
                     .logResponses(true)
                     .build();
             return Pair.of(EmbedConst.CLAZZ_NAME_ZHIPU, zhipuAiEmbeddingModel);
-        }catch (Exception e){
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
             log.error("zhipu embedding 配置报错", e);
             return null;
         }
     }
 
     @Override
-    public ImageModel imageConfig(AigcModel model) {
-        try{
-            if(!whetherCurrentModel(model)){
+    public ImageModel buildImage(AigcModel model) {
+        try {
+            if (!whetherCurrentModel(model)) {
                 return null;
             }
-            if(!basicCheck(model)){
-                log.error("zhipu 配置信息有误");
+            if (!basicCheck(model)) {
                 return null;
             }
-           return  ZhipuAiImageModel
+            return ZhipuAiImageModel
                     .builder()
                     .apiKey(model.getApiKey())
                     .model(model.getModel())
@@ -102,7 +148,10 @@ public class ZhiPuModelConfigHandler implements ModelConfigHandler{
                     .logRequests(true)
                     .logResponses(true)
                     .build();
-        }catch (Exception e){
+        } catch (ServiceException e) {
+            log.error(e.getMessage());
+            throw e;
+        } catch (Exception e) {
             log.error("zhipu image 配置报错", e);
             return null;
         }