Add File
This commit is contained in:
@@ -0,0 +1,102 @@
|
||||
package com.agentsflex.llm.qianfan;
|
||||
|
||||
import com.agentsflex.core.document.Document;
|
||||
import com.agentsflex.core.llm.ChatOptions;
|
||||
import com.agentsflex.core.llm.embedding.EmbeddingOptions;
|
||||
import com.agentsflex.core.llm.functions.Function;
|
||||
import com.agentsflex.core.llm.functions.Parameter;
|
||||
import com.agentsflex.core.message.HumanMessage;
|
||||
import com.agentsflex.core.message.Message;
|
||||
import com.agentsflex.core.parser.AiMessageParser;
|
||||
import com.agentsflex.core.parser.impl.DefaultAiMessageParser;
|
||||
import com.agentsflex.core.prompt.DefaultPromptFormat;
|
||||
import com.agentsflex.core.prompt.Prompt;
|
||||
import com.agentsflex.core.prompt.PromptFormat;
|
||||
import com.agentsflex.core.util.Maps;
|
||||
import com.agentsflex.core.util.MessageUtil;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class QianFanLlmUtil {
|
||||
private static final PromptFormat promptFormat = new DefaultPromptFormat() {
|
||||
@Override
|
||||
protected void buildFunctionJsonArray(List<Map<String, Object>> functionsJsonArray, List<Function> functions) {
|
||||
for (Function function : functions) {
|
||||
Map<String, Object> functionRoot = new HashMap<>();
|
||||
functionRoot.put("type", "function");
|
||||
|
||||
Map<String, Object> functionObj = new HashMap<>();
|
||||
functionRoot.put("function", functionObj);
|
||||
|
||||
functionObj.put("name", function.getName());
|
||||
functionObj.put("description", function.getDescription());
|
||||
|
||||
|
||||
Map<String, Object> parametersObj = new HashMap<>();
|
||||
functionObj.put("parameters", parametersObj);
|
||||
|
||||
parametersObj.put("type", "object");
|
||||
|
||||
Map<String, Object> propertiesObj = new HashMap<>();
|
||||
parametersObj.put("properties", propertiesObj);
|
||||
|
||||
List<String> requiredProperties = new ArrayList<>();
|
||||
|
||||
for (Parameter parameter : function.getParameters()) {
|
||||
Map<String, Object> parameterObj = new HashMap<>();
|
||||
parameterObj.put("type", parameter.getType());
|
||||
parameterObj.put("description", parameter.getDescription());
|
||||
if (parameter.getEnums().length > 0) {
|
||||
parameterObj.put("enum", parameter.getEnums());
|
||||
}
|
||||
if (parameter.isRequired()) {
|
||||
requiredProperties.add(parameter.getName());
|
||||
}
|
||||
|
||||
propertiesObj.put(parameter.getName(), parameterObj);
|
||||
}
|
||||
|
||||
if (!requiredProperties.isEmpty()) {
|
||||
parametersObj.put("required", requiredProperties);
|
||||
}
|
||||
|
||||
functionsJsonArray.add(functionRoot);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
public static AiMessageParser getAiMessageParser(boolean isStream) {
|
||||
return DefaultAiMessageParser.getChatGPTMessageParser(isStream);
|
||||
}
|
||||
|
||||
|
||||
public static String promptToEmbeddingsPayload(Document text, EmbeddingOptions options, QianFanLlmConfig config) {
|
||||
List<String> documents = new ArrayList<>();
|
||||
documents.add(text.getContent());
|
||||
return Maps.of("model", options.getModelOrDefault(config.getEmbeddingModel()))
|
||||
.set("encoding_format", "float")
|
||||
.set("input", documents)
|
||||
.toJSON();
|
||||
}
|
||||
|
||||
|
||||
public static String promptToPayload(Prompt prompt, QianFanLlmConfig config, ChatOptions options, boolean withStream) {
|
||||
List<Message> messages = prompt.toMessages();
|
||||
HumanMessage message = MessageUtil.findLastHumanMessage(messages);
|
||||
return Maps.of("model", Optional.ofNullable(options.getModel()).orElse(config.getModel()))
|
||||
.set("messages", promptFormat.toMessagesJsonObject(messages))
|
||||
.setIf(withStream, "stream", true)
|
||||
.setIfNotEmpty("tools", promptFormat.toFunctionsJsonObject(message))
|
||||
.setIfContainsKey("tools", "tool_choice", MessageUtil.getToolChoice(message))
|
||||
.setIfNotNull("top_p", options.getTopP())
|
||||
.setIfNotEmpty("stop", options.getStop())
|
||||
.setIf(map -> !map.containsKey("tools") && options.getTemperature() > 0, "temperature", options.getTemperature())
|
||||
.setIf(map -> !map.containsKey("tools") && options.getMaxTokens() != null, "max_tokens", options.getMaxTokens())
|
||||
.setIfNotEmpty(options.getExtra())
|
||||
.toJSON();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user