(feat)Support for managing large models with Dify #1830;2、add user access token; #1829; 3、support change password #1824 (#1839)

This commit is contained in:
zhaodongsheng
2024-10-22 13:58:58 +08:00
committed by GitHub
parent bdb20ca462
commit 0ddcdf93ec
34 changed files with 1341 additions and 45 deletions

View File

@@ -0,0 +1,95 @@
package dev.langchain4j.model.dify;
import com.tencent.supersonic.common.util.AESEncryptionUtil;
import com.tencent.supersonic.common.util.DifyClient;
import com.tencent.supersonic.common.util.DifyResult;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.output.Response;
import lombok.Builder;
import java.util.List;
import static dev.langchain4j.internal.Utils.getOrDefault;
import static dev.langchain4j.internal.Utils.isNullOrEmpty;
import static dev.langchain4j.internal.ValidationUtils.ensureNotEmpty;
import static java.util.Collections.singletonList;
public class DifyAiChatModel implements ChatLanguageModel {
private static final String CONTENT_TYPE_JSON = "application/json";
private final String baseUrl;
private final String apiKey;
private final DifyClient difyClient;
private final Integer maxRetries;
private final Integer maxToken;
private final String appName;
private final Double temperature;
private final Long timeOut;
private String userName;
@Builder
public DifyAiChatModel(String baseUrl, String apiKey, Integer maxRetries, Integer maxToken,
String modelName, Double temperature, Long timeOut) {
this.baseUrl = baseUrl;
this.maxRetries = getOrDefault(maxRetries, 3);
this.maxToken = getOrDefault(maxToken, 512);
try {
this.apiKey = AESEncryptionUtil.aesDecryptECB(apiKey);
} catch (Exception e) {
throw new RuntimeException(e);
}
this.appName = modelName;
this.temperature = temperature;
this.timeOut = timeOut;
this.difyClient = new DifyClient(this.baseUrl, this.apiKey);
}
@Override
public String generate(String message) {
DifyResult difyResult = this.difyClient.generate(message, this.getUserName());
return difyResult.getAnswer().toString();
}
@Override
public Response<AiMessage> generate(List<ChatMessage> messages) {
return generate(messages, (ToolSpecification) null);
}
@Override
public Response<AiMessage> generate(List<ChatMessage> messages,
List<ToolSpecification> toolSpecifications) {
ensureNotEmpty(messages, "messages");
DifyResult difyResult =
this.difyClient.generate(messages.get(0).text(), this.getUserName());
System.out.println(difyResult.toString());
if (!isNullOrEmpty(toolSpecifications)) {
// TODO
}
return Response.from(AiMessage.from(difyResult.getAnswer()));
}
@Override
public Response<AiMessage> generate(List<ChatMessage> messages,
ToolSpecification toolSpecification) {
return generate(messages,
toolSpecification != null ? singletonList(toolSpecification) : null);
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserName() {
return null == userName ? "zhaodongsheng" : userName;
}
}

View File

@@ -0,0 +1,41 @@
package dev.langchain4j.provider;
import com.tencent.supersonic.common.pojo.ChatModelConfig;
import com.tencent.supersonic.common.pojo.EmbeddingModelConfig;
import com.tencent.supersonic.common.util.AESEncryptionUtil;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.dify.DifyAiChatModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
import dev.langchain4j.model.zhipu.ZhipuAiEmbeddingModel;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Service;
@Service
public class DifyModelFactory implements ModelFactory, InitializingBean {
public static final String PROVIDER = "DIFY";
public static final String DEFAULT_BASE_URL = "https://dify.com/v1/chat-messages";
public static final String DEFAULT_MODEL_NAME = "demo-预留-可不填写";
public static final String DEFAULT_EMBEDDING_MODEL_NAME = "all-minilm";
@Override
public ChatLanguageModel createChatModel(ChatModelConfig modelConfig) {
return DifyAiChatModel.builder().baseUrl(modelConfig.getBaseUrl())
.apiKey(AESEncryptionUtil.aesDecryptECB(modelConfig.getApiKey()))
.modelName(modelConfig.getModelName()).timeOut(modelConfig.getTimeOut()).build();
}
@Override
public EmbeddingModel createEmbeddingModel(EmbeddingModelConfig embeddingModelConfig) {
return ZhipuAiEmbeddingModel.builder().baseUrl(embeddingModelConfig.getBaseUrl())
.apiKey(embeddingModelConfig.getApiKey()).model(embeddingModelConfig.getModelName())
.maxRetries(embeddingModelConfig.getMaxRetries())
.logRequests(embeddingModelConfig.getLogRequests())
.logResponses(embeddingModelConfig.getLogResponses()).build();
}
@Override
public void afterPropertiesSet() {
ModelProvider.add(PROVIDER, this);
}
}