diff --git a/pom.xml b/pom.xml index e1a762f954910ff0b3223cca75d1c6a4af56cf53..bab89f067314550561f499b56558dc50566b911c 100644 --- a/pom.xml +++ b/pom.xml @@ -54,6 +54,8 @@ 8 8 UTF-8 + 1.7.1 + 2.0.0-beta.1 @@ -61,7 +63,13 @@ com.agentsflex agents-flex-bom - 2.0.0-beta.1 + ${agentsflexbom.version} + + + + dev.langchain4j + langchain4j + ${langchain4j.version} diff --git a/tinyflow-support-langchain4j/pom.xml b/tinyflow-support-langchain4j/pom.xml index d86d95a6513650b2def369d3849105111eb0c99c..95d24a09779388fca476c2d1352b8d410fb30b5b 100644 --- a/tinyflow-support-langchain4j/pom.xml +++ b/tinyflow-support-langchain4j/pom.xml @@ -18,4 +18,19 @@ UTF-8 + + + dev.tinyflow + tinyflow-core + 2.0.0-beta.1 + + + + + dev.langchain4j + langchain4j + + + + \ No newline at end of file diff --git a/tinyflow-support-langchain4j/src/main/java/dev/tinyflow/langchain4j/provider/Langchain4jLLm.java b/tinyflow-support-langchain4j/src/main/java/dev/tinyflow/langchain4j/provider/Langchain4jLLm.java new file mode 100644 index 0000000000000000000000000000000000000000..4ede042711773c054cdacfd8425fe49627b5aaf3 --- /dev/null +++ b/tinyflow-support-langchain4j/src/main/java/dev/tinyflow/langchain4j/provider/Langchain4jLLm.java @@ -0,0 +1,76 @@ +package dev.tinyflow.langchain4j.provider; + +import dev.langchain4j.data.message.*; +import dev.langchain4j.model.chat.ChatModel; +import dev.langchain4j.model.chat.response.ChatResponse; +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 java.util.ArrayList; +import java.util.List; + +public class Langchain4jLLm 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 chatMessages = new ArrayList<>(); + //系统提示词 + if (StringUtil.hasText(llmNode.getSystemPrompt())) { + chatMessages.add(SystemMessage.from(llmNode.getSystemPrompt())); + } + // 系统消息 + if (StringUtil.hasText(llmNode.getSystemPrompt())) { + chatMessages.add(SystemMessage.from(messageInfo.getSystemMessage())); + } + + // 构建用户消息内容(文本+图片) + List userContents = new ArrayList<>(); + // 用户消息 + if (StringUtil.hasText(messageInfo.getMessage())) { + userContents.add(TextContent.from(messageInfo.getMessage())); + } + // 添加图片内容 + List images = messageInfo.getImages(); + if (images != null && !images.isEmpty()) { + for (String imageUrl : images) { + userContents.add(ImageContent.from(imageUrl)); + } + } + // 添加用户消息 + chatMessages.add(UserMessage.from(userContents)); + + // 发送请求并获取响应 + ChatResponse response; + + if (options != null) { + //TODO 如果有配置选项,使用模型特定的配置方式 可进行拦截model + response = chatModel.chat(chatMessages); + } else { + // 无配置选项的直接调用 + response = chatModel.chat(chatMessages); + } + + if (response == null) { + throw new RuntimeException("Langchain4jLLm can not get response!"); + } + + AiMessage aiMessage = response.aiMessage(); + if (aiMessage != null && aiMessage.text() != null) { + return aiMessage.text(); + } else { + throw new RuntimeException("Langchain4jLLm: AiMessage content is null or empty"); + } + } +} \ No newline at end of file