dcs vor 4 Tagen
Ursprung
Commit
18a3c9ca69

+ 32 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/controller/DifyController.java

@@ -109,4 +109,36 @@ public class DifyController {
         return Response.ok(difyService.getCompletionList(difyCompletion));
     }
 
+    @ApiOperation("执行对话型Chat")
+    @RequestMapping(value = "/chat/run/{difyTypeId}", method = RequestMethod.POST)
+    public Response chatRun(@PathVariable long difyTypeId, @RequestBody Map<String, Object> inputs) {
+        return Response.ok(difyService.chatRun(difyTypeId, inputs));
+    }
+
+    @ApiOperation("获取对话型Chat执行情况")
+    @RequestMapping(value = "/chat/{simpleUUID}", method = RequestMethod.GET)
+    public Response getChat(@PathVariable String simpleUUID) {
+        return Response.ok(difyService.getChat(simpleUUID));
+    }
+
+    @ApiOperation("获取会话历史消息")
+    @RequestMapping(value = "/chat/message/{conversationId}", method = RequestMethod.GET)
+    public Response chatMessageList(@PathVariable String conversationId) {
+        return Response.ok(difyService.messageList(conversationId));
+    }
+
+    @ApiOperation("获取会话列表")
+    @RequestMapping(value = "/chat/conversations/{difyTypeId}", method = RequestMethod.GET)
+    public Response chatConversations(@PathVariable long difyTypeId) {
+        return Response.ok(difyService.conversations(difyTypeId));
+    }
+
+    @ApiOperation("删除会话")
+    @RequestMapping(value = "/chat/conversation/{conversationId}", method = RequestMethod.DELETE)
+    public Response deleteConversation(@PathVariable String conversationId) {
+        difyService.deleteConversation(conversationId);
+        return Response.ok();
+    }
+
+
 }

+ 23 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/dao/DifyChatDao.java

@@ -0,0 +1,23 @@
+package com.bosshand.virgo.api.workark.dao;
+
+import com.bosshand.virgo.api.workark.model.DifyChat;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+@Mapper
+public interface DifyChatDao {
+
+    void save(DifyChat difyChat);
+
+    DifyChat getSimpleUUID(String simpleUUID);
+
+    void update(DifyChat difyChat);
+
+    List<DifyChat> getList(DifyChat difyChat);
+
+    DifyChat getConversationId(String conversationId);
+
+    void delete(String conversationId);
+
+}

+ 133 - 0
virgo.api/src/main/java/com/bosshand/virgo/api/workark/model/DifyChat.java

@@ -0,0 +1,133 @@
+package com.bosshand.virgo.api.workark.model;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.util.Date;
+
+/**
+ * 对话型应用Chat
+ */
+public class DifyChat {
+
+    private Long id;
+
+    private long difyTypeId;
+
+    private String simpleUUID;
+
+    private String conversationId;
+
+    private long userId;
+
+    private String error;
+
+    private String status;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date date;
+
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date endDate;
+
+    private String inputs;
+
+    private String outputs;
+
+    private String messageId;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public long getDifyTypeId() {
+        return difyTypeId;
+    }
+
+    public void setDifyTypeId(long difyTypeId) {
+        this.difyTypeId = difyTypeId;
+    }
+
+    public String getSimpleUUID() {
+        return simpleUUID;
+    }
+
+    public void setSimpleUUID(String simpleUUID) {
+        this.simpleUUID = simpleUUID;
+    }
+
+    public String getConversationId() {
+        return conversationId;
+    }
+
+    public void setConversationId(String conversationId) {
+        this.conversationId = conversationId;
+    }
+
+    public long getUserId() {
+        return userId;
+    }
+
+    public void setUserId(long userId) {
+        this.userId = userId;
+    }
+
+    public String getError() {
+        return error;
+    }
+
+    public void setError(String error) {
+        this.error = error;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public Date getDate() {
+        return date;
+    }
+
+    public void setDate(Date date) {
+        this.date = date;
+    }
+
+    public Date getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(Date endDate) {
+        this.endDate = endDate;
+    }
+
+    public String getInputs() {
+        return inputs;
+    }
+
+    public void setInputs(String inputs) {
+        this.inputs = inputs;
+    }
+
+    public String getOutputs() {
+        return outputs;
+    }
+
+    public void setOutputs(String outputs) {
+        this.outputs = outputs;
+    }
+
+    public String getMessageId() {
+        return messageId;
+    }
+
+    public void setMessageId(String messageId) {
+        this.messageId = messageId;
+    }
+}

+ 217 - 9
virgo.api/src/main/java/com/bosshand/virgo/api/workark/service/DifyService.java

@@ -1,24 +1,25 @@
 package com.bosshand.virgo.api.workark.service;
 
 import com.alibaba.fastjson.JSONObject;
-import com.bosshand.virgo.api.workark.dao.DifyCompletionDao;
-import com.bosshand.virgo.api.workark.dao.DifyTypeDao;
-import com.bosshand.virgo.api.workark.dao.DifyWorkFlowDao;
-import com.bosshand.virgo.api.workark.dao.HtmlCodeDao;
-import com.bosshand.virgo.api.workark.model.DifyCompletion;
-import com.bosshand.virgo.api.workark.model.DifyType;
-import com.bosshand.virgo.api.workark.model.DifyWorkFlow;
-import com.bosshand.virgo.api.workark.model.HtmlCode;
+import com.bosshand.virgo.api.workark.dao.*;
+import com.bosshand.virgo.api.workark.model.*;
 import com.bosshand.virgo.core.model.UserContext;
 import com.bosshand.virgo.core.utils.ContextUtils;
+import com.bosshand.virgo.core.utils.StringUtil;
+import io.github.imfangs.dify.client.DifyChatClient;
 import io.github.imfangs.dify.client.DifyClientFactory;
 import io.github.imfangs.dify.client.DifyCompletionClient;
 import io.github.imfangs.dify.client.DifyWorkflowClient;
+import io.github.imfangs.dify.client.callback.ChatStreamCallback;
 import io.github.imfangs.dify.client.callback.CompletionStreamCallback;
 import io.github.imfangs.dify.client.callback.WorkflowStreamCallback;
 import io.github.imfangs.dify.client.enums.ResponseMode;
 import io.github.imfangs.dify.client.event.*;
 import io.github.imfangs.dify.client.exception.DifyApiException;
+import io.github.imfangs.dify.client.model.chat.ChatMessage;
+import io.github.imfangs.dify.client.model.chat.ConversationListResponse;
+import io.github.imfangs.dify.client.model.chat.MessageListResponse;
+import io.github.imfangs.dify.client.model.common.SimpleResponse;
 import io.github.imfangs.dify.client.model.completion.CompletionRequest;
 import io.github.imfangs.dify.client.model.workflow.WorkflowRunRequest;
 import io.github.imfangs.dify.client.model.workflow.WorkflowRunStatusResponse;
@@ -42,6 +43,9 @@ public class DifyService {
     @Autowired
     DifyCompletionDao difyCompletionDao;
 
+    @Autowired
+    DifyChatDao difyChatDao;
+
     @Autowired
     HtmlCodeDao htmlCodeDao;
 
@@ -72,7 +76,7 @@ public class DifyService {
         htmlCodeDao.update(htmlCode);
     }
 
-    public String publishHtmlCode(long id){
+    public String publishHtmlCode(long id) {
         HtmlCode htmlCode = htmlCodeDao.get(id);
         htmlCode.setStatus(1);
         htmlCodeDao.update(htmlCode);
@@ -312,4 +316,208 @@ public class DifyService {
     public List<DifyCompletion> getCompletionList(DifyCompletion difyCompletion) {
         return difyCompletionDao.getList(difyCompletion);
     }
+
+    /**
+     * 对话型应用
+     */
+    public String chatRun(long difyTypeId, Map<String, Object> inputs) {
+
+        String question = inputs.get("query").toString();
+
+        DifyType difyType = difyTypeDao.get(difyTypeId);
+
+        UserContext userContext = ContextUtils.getUserContext();
+
+        String simpleUUID = UUID.randomUUID().toString().replace("-", "");
+
+        DifyChat difyChat = new DifyChat();
+        difyChat.setDifyTypeId(difyTypeId);
+        difyChat.setStatus("running");
+        difyChat.setUserId(userContext.getUserId());
+        difyChat.setSimpleUUID(simpleUUID);
+        JSONObject json = new JSONObject(inputs);
+        difyChat.setInputs(json.toJSONString());
+        difyChatDao.save(difyChat);
+
+        // 创建聊天客户端
+        DifyChatClient chatClient = DifyClientFactory.createChatClient("http://203.110.233.149:9000/v1", difyType.getApiKey());
+
+        // 创建聊天消息
+        ChatMessage message = ChatMessage.builder()
+                .query(question)
+                .user(userContext.getUserName() + "-" + userContext.getUserId())
+                .responseMode(ResponseMode.STREAMING)
+                .build();
+
+        if (inputs.containsKey("conversationId")) {
+            message.setConversationId(inputs.get("conversationId").toString());
+        }
+
+        StringBuilder chatM = new StringBuilder();
+
+        StringBuilder agentM = new StringBuilder();
+
+        // 发送流式消息
+        try {
+            chatClient.sendChatMessageStream(message, new ChatStreamCallback() {
+                @Override
+                public void onMessage(MessageEvent event) {
+                    //System.out.println("收到消息片段: " + event.getAnswer());
+                    chatM.append(event.getAnswer());
+                }
+
+                @Override
+                public void onMessageEnd(MessageEndEvent event) {
+                    DifyChat difyChat = difyChatDao.getSimpleUUID(simpleUUID);
+                    difyChat.setConversationId(event.getConversationId());
+                    difyChat.setMessageId(event.getMessageId());
+                    if (StringUtil.notBlank(chatM.toString())) {
+                        difyChat.setOutputs(chatM.toString());
+                    }
+                    if (StringUtil.notBlank(agentM.toString())) {
+                        difyChat.setOutputs(agentM.toString());
+                    }
+                    difyChat.setStatus("succeeded");
+                    difyChatDao.update(difyChat);
+                    System.out.println("消息结束,完整消息ID: " + event.getMessageId());
+                }
+
+                @Override
+                public void onMessageFile(MessageFileEvent event) {
+                    System.out.println("收到文件: " + event);
+                }
+
+                @Override
+                public void onTTSMessage(TtsMessageEvent event) {
+                    System.out.println("收到TTS消息: " + event);
+                }
+
+                @Override
+                public void onTTSMessageEnd(TtsMessageEndEvent event) {
+                    System.out.println("TTS消息结束: " + event);
+                }
+
+                @Override
+                public void onMessageReplace(MessageReplaceEvent event) {
+                    System.out.println("消息替换: " + event);
+                }
+
+                @Override
+                public void onAgentMessage(AgentMessageEvent event) {
+                    //System.out.println("收到Agent消息片段: " + event.getAnswer());
+                    agentM.append(event.getAnswer());
+                }
+
+                @Override
+                public void onAgentThought(AgentThoughtEvent event) {
+                    System.out.println("Agent思考: " + event);
+                }
+
+                @Override
+                public void onError(ErrorEvent event) {
+                    DifyChat difyChat = difyChatDao.getSimpleUUID(simpleUUID);
+                    difyChat.setError(event.getMessage());
+                    difyChat.setStatus("error");
+                    difyChatDao.update(difyChat);
+                    System.err.println("错误: " + event.getMessage());
+                }
+
+                @Override
+                public void onException(Throwable throwable) {
+                    DifyChat difyChat = difyChatDao.getSimpleUUID(simpleUUID);
+                    difyChat.setError(throwable.getMessage());
+                    difyChat.setStatus("error");
+                    difyChatDao.update(difyChat);
+                    System.err.println("异常: " + throwable.getMessage());
+                }
+            });
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (DifyApiException e) {
+            e.printStackTrace();
+        }
+        return simpleUUID;
+
+    }
+
+    public DifyChat getChat(String simpleUUID) {
+        return difyChatDao.getSimpleUUID(simpleUUID);
+    }
+
+    /**
+     * 获取会话历史消息
+     */
+    public MessageListResponse messageList(String conversationId) {
+
+        DifyChat difyChat = difyChatDao.getConversationId(conversationId);
+
+        DifyType difyType = difyTypeDao.get(difyChat.getDifyTypeId());
+
+        UserContext userContext = ContextUtils.getUserContext();
+
+        // 创建聊天客户端
+        DifyChatClient chatClient = DifyClientFactory.createChatClient("http://203.110.233.149:9000/v1", difyType.getApiKey());
+
+        // 获取会话历史消息
+        try {
+            MessageListResponse messages = chatClient.getMessages(conversationId, userContext.getUserName() + "-" + userContext.getUserId(), null, 10);
+            return messages;
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (DifyApiException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    /**
+     * 获取会话列表
+     */
+    public ConversationListResponse conversations(long difyTypeId) {
+
+        DifyType difyType = difyTypeDao.get(difyTypeId);
+
+        UserContext userContext = ContextUtils.getUserContext();
+
+        // 创建聊天客户端
+        DifyChatClient chatClient = DifyClientFactory.createChatClient("http://203.110.233.149:9000/v1", difyType.getApiKey());
+        // 获取会话列表
+        try {
+            ConversationListResponse conversations = chatClient.getConversations(userContext.getUserName() + "-" + userContext.getUserId(), null, 10, "-updated_at");
+            return conversations;
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (DifyApiException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 删除会话
+     */
+    public void deleteConversation(String conversationId) {
+
+        DifyChat difyChat = difyChatDao.getConversationId(conversationId);
+
+        DifyType difyType = difyTypeDao.get(difyChat.getDifyTypeId());
+
+        UserContext userContext = ContextUtils.getUserContext();
+
+        // 创建聊天客户端
+        DifyChatClient chatClient = DifyClientFactory.createChatClient("http://203.110.233.149:9000/v1", difyType.getApiKey());
+
+        // 删除会话
+        try {
+            SimpleResponse deleteResponse = chatClient.deleteConversation(conversationId, userContext.getUserName() + "-" + userContext.getUserId());
+            difyChatDao.delete(conversationId);
+        } catch (IOException e) {
+            e.printStackTrace();
+        } catch (DifyApiException e) {
+            e.printStackTrace();
+        }
+
+    }
+
 }

+ 70 - 0
virgo.api/src/main/resources/mapper/DifyChatMapper.xml

@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.bosshand.virgo.api.workark.dao.DifyChatDao">
+
+    <resultMap type="com.bosshand.virgo.api.workark.model.DifyChat" id="result">
+        <id column="id" property="id"/>
+        <result column="simpleUUID" property="simpleUUID"/>
+        <result column="difyTypeId" property="difyTypeId"/>
+        <result column="conversationId" property="conversationId"/>
+        <result column="userId" property="userId"/>
+        <result column="date" property="date"/>
+        <result column="endDate" property="endDate"/>
+        <result column="error" property="error"/>
+        <result column="inputs" property="inputs"/>
+        <result column="outputs" property="outputs"/>
+        <result column="messageId" property="messageId"/>
+        <result column="status" property="status"/>
+    </resultMap>
+
+    <insert id="save" parameterType="com.bosshand.virgo.api.workark.model.DifyChat" useGeneratedKeys="true" keyProperty="id">
+        INSERT INTO dify_chat(`simpleUUID`, `difyTypeId`, `conversationId`, `userId`, `date`, `inputs`, `status`)
+        VALUES (#{simpleUUID}, #{difyTypeId}, #{conversationId}, #{userId}, now(), #{inputs}, #{status})
+    </insert>
+
+    <select id="getSimpleUUID" resultMap="result">
+        SELECT * FROM dify_chat where simpleUUID = #{simpleUUID}
+    </select>
+
+    <select id="getConversationId" resultMap="result">
+        SELECT * FROM dify_chat where conversationId = #{conversationId} limit 1
+    </select>
+
+    <delete id="delete">
+        DELETE FROM dify_chat WHERE conversationId = #{conversationId}
+    </delete>
+
+    <update id="update" parameterType="com.bosshand.virgo.api.workark.model.DifyChat">
+        UPDATE dify_chat
+        <trim prefix="set" suffixOverrides=",">
+            <if test="conversationId != null">conversationId = #{conversationId},</if>
+            <if test="error != null">error = #{error},</if>
+            <if test="outputs != null">outputs = #{outputs},</if>
+            <if test="messageId != null">messageId = #{messageId},</if>
+            <if test="status != null">status = #{status},</if>
+            endDate = now(),
+        </trim>
+        WHERE id=#{id}
+    </update>
+
+    <select id="getList" resultMap="result">
+        select * from dify_chat
+        <where>
+            <if test="difyTypeId != 0">
+                and difyTypeId = #{difyTypeId}
+            </if>
+            <if test="userId != 0">
+                and userId = #{userId}
+            </if>
+            <if test="conversationId != null">
+                and conversationId = #{conversationId}
+            </if>
+            <if test="status != null">
+                and status = #{status}
+            </if>
+        </where>
+    </select>
+
+
+
+</mapper>

+ 1 - 0
virgo.api/src/main/resources/mapper/DifyCompletionMapper.xml

@@ -7,6 +7,7 @@
         <result column="simpleUUID" property="simpleUUID"/>
         <result column="difyTypeId" property="difyTypeId"/>
         <result column="date" property="date"/>
+        <result column="endDate" property="endDate"/>
         <result column="userId" property="userId"/>
         <result column="inputs" property="inputs"/>
         <result column="outputs" property="outputs"/>