Commit 8011205c authored by 何金镒's avatar 何金镒

dify聊天,必须一条一条的

parent 8555f0b0
//package com.ikonke.konkeaialibabamcp.config;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.data.redis.connection.Message;
//import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
//import org.springframework.data.redis.listener.RedisMessageListenerContainer;
//import org.springframework.stereotype.Component;
//
//@Slf4j
//@Component
//public class RedisKeyExpireListener extends KeyExpirationEventMessageListener {
//
// public RedisKeyExpireListener(RedisMessageListenerContainer listenerContainer) {
// super(listenerContainer);
// }
//
// @Override
// public void doHandleMessage(Message message) {
//
// // 过期的 key
// byte[] body = message.getBody();
//
// // 消息通道
// byte[] channel = message.getChannel();
//
// log.info("redis 过期 ------> message = {}, channel = {}", new String(body), new String(channel));
// }
//}
...@@ -78,12 +78,13 @@ public class DifyControllerV2 { ...@@ -78,12 +78,13 @@ public class DifyControllerV2 {
@ResponseBody @ResponseBody
public JSONObject bottomSkill(@RequestBody JSONObject jsonObject) { public JSONObject bottomSkill(@RequestBody JSONObject jsonObject) {
Long timestamp = System.currentTimeMillis(); Long timestamp = System.currentTimeMillis();
log.info("思必驰 bottomSkill..请求参数:{}",jsonObject.toString());
JSONObject result = jsonObject.getJSONObject("request"); JSONObject result = jsonObject.getJSONObject("request");
JSONObject context = jsonObject.getJSONObject("context"); JSONObject context = jsonObject.getJSONObject("context");
JSONObject device = context.getJSONObject("device"); JSONObject device = context.getJSONObject("device");
String deviceName = device.getStr("deviceName");//这是屏端的sn String deviceName = device.getStr("deviceName");//这是屏端的sn
log.info("【{}】:思必驰 bottomSkill..请求参数:{}",deviceName,jsonObject.toString());
String type = result.get("type").toString(); String type = result.get("type").toString();
String input; //请求文本 String input; //请求文本
String res = "{'version': '1.0','response': {'speak': {'type': 'text','text': '%s','ssml': 'SSML markup text string to speak'}},'shouldEndSession': %b}"; //忽略了部分DSK协议字段,shouldEndSession字段决定是否结束本轮对话 String res = "{'version': '1.0','response': {'speak': {'type': 'text','text': '%s','ssml': 'SSML markup text string to speak'}},'shouldEndSession': %b}"; //忽略了部分DSK协议字段,shouldEndSession字段决定是否结束本轮对话
...@@ -104,14 +105,24 @@ public class DifyControllerV2 { ...@@ -104,14 +105,24 @@ public class DifyControllerV2 {
res = String.format(res, "未绑定主机绑定", false); res = String.format(res, "未绑定主机绑定", false);
response = JSONUtil.parseObj(res); response = JSONUtil.parseObj(res);
} }
// 异步执行对话????
eventPublisher.publishEvent(new DifyChatSteamEvent(this,token.getSn(), input));
String cleanedInput = input.replaceAll("\\[\\s*\\]", "").replaceAll("【\\s*】", "").trim();
if (cleanedInput.isEmpty() || cleanedInput.equals("[]") || cleanedInput.equals("【】")) {
// 处理空列表的情况
cleanedInput = ""; // 或者设置默认值
}
if(StrUtil.isNotBlank(cleanedInput)){
// 异步执行对话????
eventPublisher.publishEvent(new DifyChatSteamEvent(this,token.getSn(), cleanedInput));
}
res = String.format(res, "正在思考中", false); res = String.format(res, "正在思考中", false);
response = JSONUtil.parseObj(res); response = JSONUtil.parseObj(res);
}else if(list.size() > 1){ }else if(list.size() > 1){
log.error("获取CDCToken失败,CDCToken数量大于1"); log.error("【{}】:获取CDCToken失败,CDCToken数量大于1",deviceName);
res = String.format(res, "绑定异常", false); res = String.format(res, "绑定异常", false);
response = JSONUtil.parseObj(res); response = JSONUtil.parseObj(res);
}else{ }else{
...@@ -123,7 +134,7 @@ public class DifyControllerV2 { ...@@ -123,7 +134,7 @@ public class DifyControllerV2 {
response = JSONUtil.parseObj(res); response = JSONUtil.parseObj(res);
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
log.info("思必驰 bottomSkill..响应时间="+(System.currentTimeMillis()-timestamp)); log.info("【{}】:思必驰 bottomSkill..响应时间={}",deviceName,(System.currentTimeMillis()-timestamp));
return response; return response;
} }
} }
...@@ -132,7 +143,7 @@ public class DifyControllerV2 { ...@@ -132,7 +143,7 @@ public class DifyControllerV2 {
@GetMapping("/chatSteamMessages") @GetMapping("/chatSteamMessages")
public Flux<String> chatSteamMessages(@RequestParam(name = "query") String query, public Flux<String> chatSteamMessages(@RequestParam(name = "query") String query,
@RequestHeader("sn") String sn){ @RequestHeader("sn") String sn){
log.info("开始 流式 对话 sn:{}, query:{}",sn,query); log.info("【{}】:开始 流式 对话, query:{}",sn,query);
QueryWrapper<CDCToken> wrapper = new QueryWrapper<>(); QueryWrapper<CDCToken> wrapper = new QueryWrapper<>();
wrapper.eq("sn", sn); wrapper.eq("sn", sn);
......
...@@ -32,37 +32,38 @@ public class DifyChatSteamEventListener { ...@@ -32,37 +32,38 @@ public class DifyChatSteamEventListener {
@EventListener @EventListener
public void handleUserRegisteredEvent(DifyChatSteamEvent event) { public void handleUserRegisteredEvent(DifyChatSteamEvent event) {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
log.info("处理dify 异步 AI 聊天:sn:{},input:{}", event.getSn(), event.getInput()); log.info("【{}】:处理dify 异步 AI 聊天,input:{}", event.getSn(), event.getInput());
try { try {
synchronized(event.getSn()){
if (!webSocketUtil.getWebSocket(event.getSn())) {
log.error("未找到sn:{}的WebSocket连接,不处理对话", event.getSn());
return;
}
if (!webSocketUtil.getWebSocket(event.getSn())) { QueryWrapper<CDCToken> wrapper = new QueryWrapper<>();
log.error("未找到sn:{}的WebSocket连接,不处理对话", event.getSn()); wrapper.eq("sn", event.getSn());
return; List<CDCToken> list = tokenService.list(wrapper);
} CDCToken token = list.get(0);
QueryWrapper<CDCToken> wrapper = new QueryWrapper<>();
wrapper.eq("sn", event.getSn());
List<CDCToken> list = tokenService.list(wrapper);
CDCToken token = list.get(0);
String url = difyChatSteamMessages + "/dify/v2/chatSteamMessages?query="+event.getInput(); String url = difyChatSteamMessages + "/dify/v2/chatSteamMessages?query="+event.getInput();
log.info("开始 dify 请求:{}",url); log.info("【{}】:开始 dify 请求:{}",event.getSn(),url);
String ai_result = HttpRequest.get(url) String ai_result = HttpRequest.get(url)
.header("ccuName", token.getCcuId() ) .header("ccuName", token.getCcuId() )
.header("token", token.getAccessToken()) .header("token", token.getAccessToken())
.header("sn",token.getSn()) .header("sn",token.getSn())
.timeout(600000) .timeout(600000)
.execute().body(); .execute().body();
log.info("dify请求返回:{}",ai_result); log.info("【{}】:dify请求返回:{}",event.getSn(),ai_result);
// String result_end = ai_result.replaceAll("(?m)^\\s*$[\r\n]*", "").replaceAll("[\r\n]+", "\n").replaceAll("[\r\n]", "").trim(); // String result_end = ai_result.replaceAll("(?m)^\\s*$[\r\n]*", "").replaceAll("[\r\n]+", "\n").replaceAll("[\r\n]", "").trim();
// log.info("dify请求返回2--->:{}",result_end); // log.info("dify请求返回2--->:{}",result_end);
// 通过WebSocket发送消息给屏端 // 通过WebSocket发送消息给屏端
webSocketUtil.sendToSingle(event.getSn(), ai_result); webSocketUtil.sendToSingle(event.getSn(), ai_result);
log.info("dify异步请求耗时--->:{}",System.currentTimeMillis() - startTime); log.info("【{}】:dify异步请求耗时--->:{}",event.getSn(),System.currentTimeMillis() - startTime);
}
} catch (Exception e) { } catch (Exception e) {
Thread.currentThread().interrupt(); Thread.currentThread().interrupt();
e.printStackTrace(); e.printStackTrace();
......
//package com.ikonke.konkeaialibabamcp; package com.ikonke.konkeaialibabamcp;
//
//import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUnit;
//import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
//import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpRequest;
//import cn.hutool.json.JSONArray; import cn.hutool.json.JSONArray;
//import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
//import com.ikonke.konkeaialibabamcp.service.cdc.spaces.SpacesService; import com.ikonke.konkeaialibabamcp.service.cdc.spaces.SpacesService;
//import com.ikonke.konkeaialibabamcp.utils.CDCUtils; import com.ikonke.konkeaialibabamcp.utils.CDCUtils;
//import com.ikonke.konkeaialibabamcp.utils.CcuUtils; import com.ikonke.konkeaialibabamcp.utils.CcuUtils;
//import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
//import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
//
//import java.util.ArrayList; import java.util.ArrayList;
//import java.util.Date; import java.util.Date;
//import java.util.List; import java.util.List;
//import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletableFuture;
//import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
//
//@SpringBootTest @SpringBootTest
//class KonkeAiAlibabaMcpApplicationTests { class KonkeAiAlibabaMcpApplicationTests {
//
// @Autowired @Autowired
// private SpacesService spacesService; private SpacesService spacesService;
//
// public static String sn = "00226DA86A12"; public static String sn = "00226DA86A12";
// public static String date = "2025-08-13"; public static String date = "2025-08-13";
// public static String roomId = "123309ac482d469c8608ce95e51da65a"; public static String roomId = "123309ac482d469c8608ce95e51da65a";
// public static String subspaceId = null; public static String subspaceId = null;
//
//
//
//// @Test
//// void testHttp(){
//// String url = "http://172.17.12.12:9998/dify/chatSteamMessages?query=现在是不是已经秋天了";
//// String body1 = HttpRequest.get(url)
//// .header("ccuName", "CCU_321410" )
//// .header("token", "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMDA3NjdkOTAzZDU0NDY1YmE4YjdjMjY3MTMzZmFkZTAiLCJ1c2VyX2tleSI6IjA3MWY5NzE1LTYxZjQtNDYwYS05ZjA5LWY1NDAxYTEwNGM2OCIsInVzZXJuYW1lIjoiSXgrNk5RUno1ZE1vNnFqMndrN2twQT09In0.FbMce1Zoe_Xkeoo9v1S04swrIP3Wb-WZw9FwS3k60UBBM25fbCgZFlUaJo08X4xcxgAbEmYFpXUG2lopFXsCng")
//// .header("sn","00226DA86ABB")
//// .timeout(1000000)
//// .execute().body();
//// System.out.println("====================");
//// System.out.println(body1);
//// System.out.println("=======================");
//// }
//
//// @Test
//// void testThread(){
//// int threadCount = 60;
//// CountDownLatch latch = new CountDownLatch(threadCount);
////
//// for (int i = 0; i < threadCount; i++) {
//// int finalI = i;
//// Thread thread = new Thread(() -> {
//// try {
//// long begin = System.currentTimeMillis();
//// String url = "172.17.12.12:9998/dify/chatSteamMessages?query=小明一天能赚325,那么"+ finalI +"天能赚多少钱?";
//// String ccuName = "CCU_32142"+ finalI;
//// String sn = "00226DA86AD"+ finalI;
//// String token = "11A"+ finalI;
//// String result2 = HttpRequest.get(url)
//// .header("ccuName", ccuName)//头信息,多个头信息多次调用此方法即可
//// .header("sn", sn)
//// .header("token", token)
//// .timeout(2000000)//超时,毫秒
//// .execute().body();
//// System.out.println(finalI +"------->"+result2);
//// System.out.println(finalI +"------->耗时:"+(System.currentTimeMillis()-begin));
//// }finally {
//// latch.countDown();
//// }
//// });
//// thread.start();
//// }
////
//// try {
//// // 等待所有线程执行完成
//// latch.await();
//// System.out.println("所有线程执行完成");
//// } catch (InterruptedException e) {
//// Thread.currentThread().interrupt();
//// e.printStackTrace();
//// }
//// }
//
//// @Test
//// void test(){
//// for(int i = 0; i < 1; i++){
//// long begin = System.currentTimeMillis();
//// String url = "172.17.12.12:9998/dify/chatSteamMessages?query=324252加"+i+"等于几";
//// String ccuName = "CCU_32142"+i;
//// String sn = "00226DA86AD"+i;
//// String token = "11A"+i;
//// String result2 = HttpRequest.get(url)
//// .header("ccuName", ccuName)//头信息,多个头信息多次调用此方法即可
//// .header("sn", sn)
//// .header("token", token)
//// .timeout(20000)//超时,毫秒
//// .execute().body();
//// System.out.println(i+"------->"+result2);
//// System.out.println(i+"------->耗时:"+(System.currentTimeMillis()-begin));
//// }
//// }
//
// @Test // @Test
// void contextLoads() { // void testSpacesService() {
//// JSONObject appointmentTimeByRoomId = spacesService.getAppointmentTimeByRoomId(sn, date, roomId, subspaceId); // String input = "小明一天能赚325,那么1天能赚多少钱?[1]【】【你】[]";
//// System.out.println(appointmentTimeByRoomId); // String cleanedInput = input.replaceAll("\\[\\s*\\]", "").replaceAll("【\\s*】", "").trim();
//// mcp调用--->getUserSpacesCouponsByTime..获取用户当前预约可用的优惠券..sn:00226DA86A12,roomId:123309ac482d469c8608ce95e51da65a,beginTime:2025-08-15 00:00:00,endTime:2025-08-15 23:59:59 // System.out.println(cleanedInput);
//// JSONArray userSpacesCouponsByBooking = spacesService.getUserSpacesCouponsByTime(sn, roomId, "2025-08-15 00:00:00", "2025-08-15 23:59:59");
//// System.out.println(userSpacesCouponsByBooking);
//
//// Date begin_time = DateUtil.parse("2025-08-15 00:00:00");
//// Date end_time = DateUtil.parse("2025-08-15 23:59:59");
//// long time = DateUtil.beginOfDay(begin_time).getTime();
//// long time1 = DateUtil.endOfDay(begin_time).getTime();
//// System.out.println(time);
//// System.out.println(begin_time.getTime());
//// System.out.println(time1);
//// System.out.println(end_time.toInstant());
//// System.out.println(DateUtil.between(end_time, DateUtil.endOfDay(begin_time), DateUnit.SECOND));
//
//// boolean b = spacesService.bookingOrder2(sn, "2025-08-14 18:00:00", "2025-08-14 21:00:00", "a550c009a8c041c2ba3fa22490583770", null, 1);
//// System.out.println(b);
//
//
//
// } // }
//
//
//// @Test // @Test
//// void difyTest(){ // void testHttp(){
//// //workflows/run // String url = "http://172.17.12.12:9998/dify/chatSteamMessages?query=现在是不是已经秋天了";
//// String url = "http://172.17.12.12:8088/v1/chat-messages"; // String body1 = HttpRequest.get(url)
//// String userId = "00226DA86A12"; // .header("ccuName", "CCU_321410" )
//// String api_key = "app-YHXQcZVzokkdsrQ3mTOFhO9x"; // .header("token", "eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMDA3NjdkOTAzZDU0NDY1YmE4YjdjMjY3MTMzZmFkZTAiLCJ1c2VyX2tleSI6IjA3MWY5NzE1LTYxZjQtNDYwYS05ZjA5LWY1NDAxYTEwNGM2OCIsInVzZXJuYW1lIjoiSXgrNk5RUno1ZE1vNnFqMndrN2twQT09In0.FbMce1Zoe_Xkeoo9v1S04swrIP3Wb-WZw9FwS3k60UBBM25fbCgZFlUaJo08X4xcxgAbEmYFpXUG2lopFXsCng")
//// String query = "帮我打开客厅的单路灯控"; // .header("sn","00226DA86ABB")
//// // .timeout(1000000)
//// JSONObject inputs = new JSONObject(); // .execute().body();
//// inputs.set("ccuName","CCU_313858"); // System.out.println("====================");
//// inputs.set("sn",userId); // System.out.println(body1);
//// inputs.set("token","eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMDA3NjdkOTAzZDU0NDY1YmE4YjdjMjY3MTMzZmFkZTAiLCJ1c2VyX2tleSI6IjcwZGUyNmU2LTQyYWQtNGE5MS05ZmY5LTE5ZjAzOWMyYWMyNCIsInVzZXJuYW1lIjoiSXgrNk5RUno1ZE1vNnFqMndrN2twQT09In0.g7dnCLgR_xGPbxu9nmUQJeCW8cGfz946vRyhO6fga783EBjfSQYd8Et8grm3M79Oalhe6ZvEwY5Ii1OHSKHcwQ"); // System.out.println("=======================");
//// // }
//// JSONObject body = new JSONObject();
//// body.set("inputs",inputs); // @Test
//// body.set("query",query); // void testThread(){
//// body.set("response_mode","blocking"); // int threadCount = 60;
//// body.set("user",userId); // CountDownLatch latch = new CountDownLatch(threadCount);
//// body.set("conversation_id","a5597ffd-18c5-430d-af16-60d9ea14ac41"); //
//// // for (int i = 0; i < threadCount; i++) {
//// String body1 = HttpRequest.post(url) // int finalI = i;
//// .header("Authorization", "Bearer " + api_key) // Thread thread = new Thread(() -> {
//// .header("Content-Type", "application/json") // try {
//// .body(body.toString()) // long begin = System.currentTimeMillis();
//// .timeout(1000000) // String url = "172.17.12.12:9998/dify/chatSteamMessages?query=小明一天能赚325,那么"+ finalI +"天能赚多少钱?";
//// .execute().body(); // String ccuName = "CCU_32142"+ finalI;
//// // String sn = "00226DA86AD"+ finalI;
//// System.out.println(body1); // String token = "11A"+ finalI;
//// JSONObject jsonObject = new JSONObject(body1); // String result2 = HttpRequest.get(url)
//// System.out.println(jsonObject.getStr("answer")); // .header("ccuName", ccuName)//头信息,多个头信息多次调用此方法即可
//// } // .header("sn", sn)
// // .header("token", token)
//} // .timeout(2000000)//超时,毫秒
// .execute().body();
// System.out.println(finalI +"------->"+result2);
// System.out.println(finalI +"------->耗时:"+(System.currentTimeMillis()-begin));
// }finally {
// latch.countDown();
// }
// });
// thread.start();
// }
//
// try {
// // 等待所有线程执行完成
// latch.await();
// System.out.println("所有线程执行完成");
// } catch (InterruptedException e) {
// Thread.currentThread().interrupt();
// e.printStackTrace();
// }
// }
// @Test
// void test(){
// for(int i = 0; i < 1; i++){
// long begin = System.currentTimeMillis();
// String url = "172.17.12.12:9998/dify/chatSteamMessages?query=324252加"+i+"等于几";
// String ccuName = "CCU_32142"+i;
// String sn = "00226DA86AD"+i;
// String token = "11A"+i;
// String result2 = HttpRequest.get(url)
// .header("ccuName", ccuName)//头信息,多个头信息多次调用此方法即可
// .header("sn", sn)
// .header("token", token)
// .timeout(20000)//超时,毫秒
// .execute().body();
// System.out.println(i+"------->"+result2);
// System.out.println(i+"------->耗时:"+(System.currentTimeMillis()-begin));
// }
// }
@Test
void contextLoads() {
// JSONObject appointmentTimeByRoomId = spacesService.getAppointmentTimeByRoomId(sn, date, roomId, subspaceId);
// System.out.println(appointmentTimeByRoomId);
// mcp调用--->getUserSpacesCouponsByTime..获取用户当前预约可用的优惠券..sn:00226DA86A12,roomId:123309ac482d469c8608ce95e51da65a,beginTime:2025-08-15 00:00:00,endTime:2025-08-15 23:59:59
// JSONArray userSpacesCouponsByBooking = spacesService.getUserSpacesCouponsByTime(sn, roomId, "2025-08-15 00:00:00", "2025-08-15 23:59:59");
// System.out.println(userSpacesCouponsByBooking);
// Date begin_time = DateUtil.parse("2025-08-15 00:00:00");
// Date end_time = DateUtil.parse("2025-08-15 23:59:59");
// long time = DateUtil.beginOfDay(begin_time).getTime();
// long time1 = DateUtil.endOfDay(begin_time).getTime();
// System.out.println(time);
// System.out.println(begin_time.getTime());
// System.out.println(time1);
// System.out.println(end_time.toInstant());
// System.out.println(DateUtil.between(end_time, DateUtil.endOfDay(begin_time), DateUnit.SECOND));
// boolean b = spacesService.bookingOrder2(sn, "2025-08-14 18:00:00", "2025-08-14 21:00:00", "a550c009a8c041c2ba3fa22490583770", null, 1);
// System.out.println(b);
}
// @Test
// void difyTest(){
// //workflows/run
// String url = "http://172.17.12.12:8088/v1/chat-messages";
// String userId = "00226DA86A12";
// String api_key = "app-YHXQcZVzokkdsrQ3mTOFhO9x";
// String query = "帮我打开客厅的单路灯控";
//
// JSONObject inputs = new JSONObject();
// inputs.set("ccuName","CCU_313858");
// inputs.set("sn",userId);
// inputs.set("token","eyJhbGciOiJIUzUxMiJ9.eyJ1c2VyX2lkIjoiMDA3NjdkOTAzZDU0NDY1YmE4YjdjMjY3MTMzZmFkZTAiLCJ1c2VyX2tleSI6IjcwZGUyNmU2LTQyYWQtNGE5MS05ZmY5LTE5ZjAzOWMyYWMyNCIsInVzZXJuYW1lIjoiSXgrNk5RUno1ZE1vNnFqMndrN2twQT09In0.g7dnCLgR_xGPbxu9nmUQJeCW8cGfz946vRyhO6fga783EBjfSQYd8Et8grm3M79Oalhe6ZvEwY5Ii1OHSKHcwQ");
//
// JSONObject body = new JSONObject();
// body.set("inputs",inputs);
// body.set("query",query);
// body.set("response_mode","blocking");
// body.set("user",userId);
// body.set("conversation_id","a5597ffd-18c5-430d-af16-60d9ea14ac41");
//
// String body1 = HttpRequest.post(url)
// .header("Authorization", "Bearer " + api_key)
// .header("Content-Type", "application/json")
// .body(body.toString())
// .timeout(1000000)
// .execute().body();
//
// System.out.println(body1);
// JSONObject jsonObject = new JSONObject(body1);
// System.out.println(jsonObject.getStr("answer"));
// }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment