From 44d7df942fd0abb7e7effa96812c928a6e63424a Mon Sep 17 00:00:00 2001
From: yaxin <daixiaoyi@supervision.ltd>
Date: Wed, 19 Feb 2025 16:24:18 +0800
Subject: [PATCH] dify util

---
 pom.xml                                       |  9 +++
 .../common/constant/DifyConstants.java        | 28 +++++++++
 .../model/dify/DIFYChatReqInputVO.java        | 17 ++++++
 .../supervision/model/dify/DatasetReqVO.java  | 13 ++++
 .../supervision/model/dify/DatasetResVO.java  | 24 ++++++++
 .../supervision/model/dify/DifyChatReqVO.java | 14 +++++
 .../supervision/model/dify/DifyChatResVO.java | 16 +++++
 .../model/dify/KnowledgeBaseSegmentVO.java    | 11 ++++
 .../com/supervision/model/dify/Metadata.java  |  8 +++
 .../com/supervision/model/dify/Usage.java     | 19 ++++++
 .../com/supervision/util/DifyApiUtil.java     | 61 +++++++++++++++++++
 11 files changed, 220 insertions(+)
 create mode 100644 src/main/java/com/supervision/common/constant/DifyConstants.java
 create mode 100644 src/main/java/com/supervision/model/dify/DIFYChatReqInputVO.java
 create mode 100644 src/main/java/com/supervision/model/dify/DatasetReqVO.java
 create mode 100644 src/main/java/com/supervision/model/dify/DatasetResVO.java
 create mode 100644 src/main/java/com/supervision/model/dify/DifyChatReqVO.java
 create mode 100644 src/main/java/com/supervision/model/dify/DifyChatResVO.java
 create mode 100644 src/main/java/com/supervision/model/dify/KnowledgeBaseSegmentVO.java
 create mode 100644 src/main/java/com/supervision/model/dify/Metadata.java
 create mode 100644 src/main/java/com/supervision/model/dify/Usage.java
 create mode 100644 src/main/java/com/supervision/util/DifyApiUtil.java

diff --git a/pom.xml b/pom.xml
index 5e856f1..9934593 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,6 +40,15 @@
             <artifactId>lombok</artifactId>
             <optional>true</optional>
         </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents.client5</groupId>
+            <artifactId>httpclient5</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83_noneautotype</version>
+        </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
diff --git a/src/main/java/com/supervision/common/constant/DifyConstants.java b/src/main/java/com/supervision/common/constant/DifyConstants.java
new file mode 100644
index 0000000..5d537ec
--- /dev/null
+++ b/src/main/java/com/supervision/common/constant/DifyConstants.java
@@ -0,0 +1,28 @@
+package com.supervision.common.constant;
+
+public class DifyConstants {
+    public static final String QA_TYPE_DIFY = "0";
+    public static final String QA_TYPE_NX_LLM = "1";
+
+    public static final String INTENT_TYPE_INDEX_RESULT = "0";
+    public static final String INTENT_TYPE_CASE_RESULT = "1";
+    public static final String INTENT_TYPE_CASE_OVERVIEW = "2";
+    public static final String INTENT_TYPE_CASE_EVIDENCE_GUIDE = "3";
+
+    public static final String METHOD_DATASET = "/datasets";
+    public static final String METHOD_DOCUMENT = "/document";
+    public static final String METHOD_DOCUMENTS = "/documents";
+    public static final String METHOD_CREATE_BY_FILE = "/create-by-file";
+    public static final String METHOD_CREATE_BY_TEXT = "/create_by_text";
+    public static final String METHOD_CHAT_MESSAGES = "/chat-messages";
+
+    public static final String DATASET_INDEXING_TECHNIQUE_HIGH_QUALITY = "high_quality";
+    public static final String CHAT_RESPONSE_MODE_BLOCKING = "blocking";
+    public static final String CHAT_RESPONSE_MODE_STREAMING = "streaming";
+
+    public static final String INTENT_TYPE_TEXT_CASE_RESULT = "案件分析结果";
+    public static final String INTENT_TYPE_TEXT_CASE_OVERVIEW = "案件概况";
+    public static final String INTENT_TYPE_TEXT_CASE_EVIDENCE_GUIDE = "案件证据指引";
+
+
+}
diff --git a/src/main/java/com/supervision/model/dify/DIFYChatReqInputVO.java b/src/main/java/com/supervision/model/dify/DIFYChatReqInputVO.java
new file mode 100644
index 0000000..071c5c2
--- /dev/null
+++ b/src/main/java/com/supervision/model/dify/DIFYChatReqInputVO.java
@@ -0,0 +1,17 @@
+package com.supervision.model.dify;
+
+import lombok.Data;
+
+@Data
+public class DIFYChatReqInputVO {
+    private String type;
+    private String intent_type;
+    private String case_id;
+    private String user_id;
+    private String conversation_id;
+    private String dataset_id;
+    private String participator;
+    private int dialogue_count;
+    private String previous_query;
+    private String previous_answer;
+}
diff --git a/src/main/java/com/supervision/model/dify/DatasetReqVO.java b/src/main/java/com/supervision/model/dify/DatasetReqVO.java
new file mode 100644
index 0000000..7a2c6a6
--- /dev/null
+++ b/src/main/java/com/supervision/model/dify/DatasetReqVO.java
@@ -0,0 +1,13 @@
+package com.supervision.model.dify;
+
+import lombok.Data;
+
+import static com.supervision.common.constant.DifyConstants.DATASET_INDEXING_TECHNIQUE_HIGH_QUALITY;
+
+@Data
+public class DatasetReqVO {
+    private String name;
+    private String description;
+    private String indexing_technique = DATASET_INDEXING_TECHNIQUE_HIGH_QUALITY;
+
+}
diff --git a/src/main/java/com/supervision/model/dify/DatasetResVO.java b/src/main/java/com/supervision/model/dify/DatasetResVO.java
new file mode 100644
index 0000000..9fa18af
--- /dev/null
+++ b/src/main/java/com/supervision/model/dify/DatasetResVO.java
@@ -0,0 +1,24 @@
+package com.supervision.model.dify;
+
+import lombok.Data;
+
+@Data
+public class DatasetResVO {
+    private String id;
+    private String name;
+    private String description;
+    private String provider;
+    private String permission;
+    private String data_source_type;
+    private String indexing_technique;
+    private String app_count;
+    private String document_count;
+    private String word_count;
+    private String created_by;
+    private String created_at;
+    private String updated_by;
+    private String updated_at;
+    private String embedding_model;
+    private String embedding_model_provider;
+    private String embedding_available;
+}
diff --git a/src/main/java/com/supervision/model/dify/DifyChatReqVO.java b/src/main/java/com/supervision/model/dify/DifyChatReqVO.java
new file mode 100644
index 0000000..63a0038
--- /dev/null
+++ b/src/main/java/com/supervision/model/dify/DifyChatReqVO.java
@@ -0,0 +1,14 @@
+package com.supervision.model.dify;
+
+import lombok.Data;
+
+import static com.supervision.common.constant.DifyConstants.CHAT_RESPONSE_MODE_BLOCKING;
+
+@Data
+public class DifyChatReqVO {
+    private String conversationId;
+    private String user;
+    private String query;
+    private String response_mode = CHAT_RESPONSE_MODE_BLOCKING;
+    private DIFYChatReqInputVO inputs = new DIFYChatReqInputVO();
+}
diff --git a/src/main/java/com/supervision/model/dify/DifyChatResVO.java b/src/main/java/com/supervision/model/dify/DifyChatResVO.java
new file mode 100644
index 0000000..83c1ac7
--- /dev/null
+++ b/src/main/java/com/supervision/model/dify/DifyChatResVO.java
@@ -0,0 +1,16 @@
+package com.supervision.model.dify;
+
+import lombok.Data;
+
+@Data
+public class DifyChatResVO {
+    private String event;
+    private String task_id;
+    private String id;
+    private String message_id;
+    private String conversation_id;
+    private String mode;
+    private String answer;
+    private Metadata metadata;
+    private String created_at;
+}
diff --git a/src/main/java/com/supervision/model/dify/KnowledgeBaseSegmentVO.java b/src/main/java/com/supervision/model/dify/KnowledgeBaseSegmentVO.java
new file mode 100644
index 0000000..2108edf
--- /dev/null
+++ b/src/main/java/com/supervision/model/dify/KnowledgeBaseSegmentVO.java
@@ -0,0 +1,11 @@
+package com.supervision.model.dify;
+
+import lombok.Data;
+
+@Data
+public class KnowledgeBaseSegmentVO {
+    private String id;
+    private String name;
+    private String snippet;
+    private String score;
+}
diff --git a/src/main/java/com/supervision/model/dify/Metadata.java b/src/main/java/com/supervision/model/dify/Metadata.java
new file mode 100644
index 0000000..5dc32ef
--- /dev/null
+++ b/src/main/java/com/supervision/model/dify/Metadata.java
@@ -0,0 +1,8 @@
+package com.supervision.model.dify;
+
+import lombok.Data;
+
+@Data
+public class Metadata {
+    private Usage usage;
+}
diff --git a/src/main/java/com/supervision/model/dify/Usage.java b/src/main/java/com/supervision/model/dify/Usage.java
new file mode 100644
index 0000000..877337a
--- /dev/null
+++ b/src/main/java/com/supervision/model/dify/Usage.java
@@ -0,0 +1,19 @@
+package com.supervision.model.dify;
+
+import lombok.Data;
+
+@Data
+public class Usage {
+    private int promptTokens;
+    private String promptUnitPrice;
+    private String promptPriceUnit;
+    private String promptPrice;
+    private int completionTokens;
+    private String completionUnitPrice;
+    private String completionPriceUnit;
+    private String completionPrice;
+    private int totalTokens;
+    private String totalPrice;
+    private String currency;
+    private double latency;
+}
diff --git a/src/main/java/com/supervision/util/DifyApiUtil.java b/src/main/java/com/supervision/util/DifyApiUtil.java
new file mode 100644
index 0000000..8352393
--- /dev/null
+++ b/src/main/java/com/supervision/util/DifyApiUtil.java
@@ -0,0 +1,61 @@
+package com.supervision.util;
+
+import com.alibaba.fastjson.JSON;
+import com.supervision.model.dify.DifyChatReqVO;
+import com.supervision.model.dify.DifyChatResVO;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.hc.client5.http.ClientProtocolException;
+import org.apache.hc.client5.http.classic.methods.HttpPost;
+import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
+import org.apache.hc.client5.http.impl.classic.HttpClients;
+import org.apache.hc.core5.http.HttpEntity;
+import org.apache.hc.core5.http.HttpHeaders;
+import org.apache.hc.core5.http.HttpStatus;
+import org.apache.hc.core5.http.io.entity.EntityUtils;
+import org.apache.hc.core5.http.io.entity.StringEntity;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.nio.charset.StandardCharsets;
+
+import static com.supervision.common.constant.DifyConstants.METHOD_CHAT_MESSAGES;
+
+@Component
+@Slf4j
+public class DifyApiUtil {
+
+    @Value("${dify.url}")
+    private String difyUrl;
+    @Value("${dify.dataset-auth}")
+    private String difyDatasetAuth;
+    @Value("${dify.app-auth}")
+    private String difyAppAuth;
+
+    public DifyChatResVO chat(DifyChatReqVO difyChatReqVO) {
+        DifyChatResVO difyChatResVO = null;
+        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
+            HttpPost httpPost = new HttpPost(difyUrl + METHOD_CHAT_MESSAGES);
+            httpPost.setHeader(HttpHeaders.AUTHORIZATION, difyAppAuth);
+            httpPost.setHeader(HttpHeaders.CONTENT_TYPE, "application/json");
+            log.info("发起对话:{}", difyChatReqVO);
+            StringEntity entity = new StringEntity(com.alibaba.fastjson.JSONObject.toJSON(difyChatReqVO).toString(), StandardCharsets.UTF_8);
+            httpPost.setEntity(entity);
+            difyChatResVO = httpClient.execute(httpPost, response -> {
+                final int status = response.getCode();
+                if (status >= HttpStatus.SC_SUCCESS && status < HttpStatus.SC_REDIRECTION) {
+                    final HttpEntity responseEntity = response.getEntity();
+                    String responseStr = EntityUtils.toString(responseEntity);
+                    log.info("发起对话成功!");
+                    return JSON.parseObject(responseStr, DifyChatResVO.class);
+                } else {
+                    log.info("responseEntity {}", EntityUtils.toString(response.getEntity()));
+                    throw new ClientProtocolException("Unexpected response status: " + status);
+                }
+            });
+        } catch (Exception e) {
+            log.error("发起对话失败", e);
+        }
+        return difyChatResVO;
+    }
+
+}