diff --git a/pom.xml b/pom.xml index 553e586bd5b6fc50d4f2ee2e7bb10a3772b64573..25444c6d6672284aa9748e6da78d192f2d834314 100644 --- a/pom.xml +++ b/pom.xml @@ -57,21 +57,35 @@ UTF-8 1.7.1 2.0.0-beta.2 + 2.0.0-beta.1 + 1.0.0-M6 + + + dev.tinyflow + tinyflow-core + ${agentsflexcore.version} + com.agentsflex agents-flex-bom ${agentsflexbom.version} - + dev.langchain4j langchain4j ${langchain4j.version} + + + org.springframework.ai + spring-ai-core + ${springai.version} + diff --git a/tinyflow-support-agentsflex/pom.xml b/tinyflow-support-agentsflex/pom.xml index 88d8852cea5f567e003c2e73078cf87e952135a9..9d5f90c49187fc79b7569db0d4486f9c94ccb87c 100644 --- a/tinyflow-support-agentsflex/pom.xml +++ b/tinyflow-support-agentsflex/pom.xml @@ -22,7 +22,6 @@ dev.tinyflow tinyflow-core - 2.0.0-beta.1 diff --git a/tinyflow-support-langchain4j/pom.xml b/tinyflow-support-langchain4j/pom.xml index 95d24a09779388fca476c2d1352b8d410fb30b5b..7b467629b0d38d55ec9447e458c7df0d8fadcad6 100644 --- a/tinyflow-support-langchain4j/pom.xml +++ b/tinyflow-support-langchain4j/pom.xml @@ -22,7 +22,6 @@ dev.tinyflow tinyflow-core - 2.0.0-beta.1 diff --git a/tinyflow-support-springai/pom.xml b/tinyflow-support-springai/pom.xml index bc0fe058d5a34bde67d68a2cd9345a0d7bd0a41a..9704da8d5ad3d249b272ea72f956d664958b2d1c 100644 --- a/tinyflow-support-springai/pom.xml +++ b/tinyflow-support-springai/pom.xml @@ -8,9 +8,18 @@ tinyflow-java 2.0.0-beta.1 - - tinyflow-support-springai tinyflow-support-springai + tinyflow-support-springai + + + dev.tinyflow + tinyflow-core + + + org.springframework.ai + spring-ai-core + + 8 diff --git a/tinyflow-support-springai/src/main/java/dev/tinyflow/springai/provider/SpringAiLLm b/tinyflow-support-springai/src/main/java/dev/tinyflow/springai/provider/SpringAiLLm new file mode 100644 index 0000000000000000000000000000000000000000..36c9a90988207dbade86e1000b818d97b887e5b6 --- /dev/null +++ b/tinyflow-support-springai/src/main/java/dev/tinyflow/springai/provider/SpringAiLLm @@ -0,0 +1,90 @@ +package dev.tinyflow.springai.provider; + +import dev.tinyflow.core.chain.Chain; +import dev.tinyflow.core.llm.Llm; +import dev.tinyflow.core.node.LlmNode; +import dev.tinyflow.core.util.StringUtil; +import org.springframework.ai.chat.messages.Message; +import org.springframework.ai.chat.messages.SystemMessage; +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.ai.chat.model.ChatModel; +import org.springframework.ai.chat.model.ChatResponse; +import org.springframework.ai.chat.prompt.Prompt; +import org.springframework.util.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class SpringAiLLm implements Llm { + + private ChatModel chatModel; + + public ChatModel getChatModel() { + return chatModel; + } + + public void setChatModel(ChatModel chatModel) { + this.chatModel = chatModel; + } + + @Override + public String chat(MessageInfo messageInfo, ChatOptions options, LlmNode llmNode, Chain chain) { + + List messages = new ArrayList<>(); + + if (StringUtil.hasText(llmNode.getSystemPrompt())) { + messages.add(new SystemMessage(llmNode.getSystemPrompt())); + } + + if (StringUtil.hasText(messageInfo.getSystemMessage())) { + messages.add(new SystemMessage(messageInfo.getSystemMessage())); + } + + List images = messageInfo.getImages(); + if (images != null && !images.isEmpty()) { + + StringBuilder contentBuilder = new StringBuilder(); + if (StringUtils.hasText(messageInfo.getMessage())) { + contentBuilder.append(messageInfo.getMessage()).append("\n"); + } + contentBuilder.append("包含以下图片:"); + for (String imageUrl : images) { + contentBuilder.append("\n").append(imageUrl); + } + messages.add(new UserMessage(contentBuilder.toString())); + } else { + + if (StringUtils.hasText(messageInfo.getMessage())) { + messages.add(new UserMessage(messageInfo.getMessage())); + } + } + // TODO 目前不支持随机种子 + org.springframework.ai.chat.prompt.ChatOptions chatOptions = org.springframework.ai.chat.prompt.ChatOptions.builder() + .temperature(Optional.ofNullable(options.getTemperature()) + .map(Float::doubleValue) + .orElse(null)) + .topP(Optional.ofNullable(options.getTopP()) + .map(Float::doubleValue) + .orElse(null)) + .topK(options.getTopK()) + .maxTokens(options.getMaxTokens()) + .stopSequences(options.getStop()) + .build(); + + Prompt prompt = new Prompt(messages, chatOptions); + + ChatResponse response = chatModel.call(prompt); + + if (response == null) { + throw new RuntimeException("SpringAiLLm cannot get response!"); + } + + org.springframework.ai.chat.messages.AssistantMessage assistantMessage = response.getResult().getOutput(); + if (assistantMessage != null && assistantMessage.getText() != null) { + return assistantMessage.getText(); + } else { + throw new RuntimeException("SpringAiLLm: AssistantMessage content is null or empty"); + } + } +} \ No newline at end of file