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