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