From b370b13fe023f451d236bed0faf31ee044f687bf Mon Sep 17 00:00:00 2001 From: wulin Date: Thu, 16 Nov 2023 21:00:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=98=9F=E5=B0=98=E5=AF=B9=E6=8E=A5=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../qiuguo/iot/base/enums/DeviceCodeEnum.java | 2 +- .../entity/device/DeviceUserBindEntity.java | 2 +- .../request/qwen/TongYiCommunicationRest.java | 8 ++ iot-common/iot-third/pom.xml | 8 ++ .../qiuguo/iot/third/nlp/AliYunXingChen.java | 112 ++++++++++++++++++ .../third/service/TongYiXinChenService.java | 57 +++++++++ iot-modules/iot-box-websocket-api/pom.xml | 8 +- .../websocket/api/command/ActionCommand.java | 7 +- .../src/main/resources/bootstrap-dev.yml | 5 +- 9 files changed, 197 insertions(+), 12 deletions(-) create mode 100644 iot-common/iot-third/src/main/java/com/qiuguo/iot/third/nlp/AliYunXingChen.java create mode 100644 iot-common/iot-third/src/main/java/com/qiuguo/iot/third/service/TongYiXinChenService.java diff --git a/iot-common/iot-base/src/main/java/com/qiuguo/iot/base/enums/DeviceCodeEnum.java b/iot-common/iot-base/src/main/java/com/qiuguo/iot/base/enums/DeviceCodeEnum.java index b610e61..ce3f2bc 100644 --- a/iot-common/iot-base/src/main/java/com/qiuguo/iot/base/enums/DeviceCodeEnum.java +++ b/iot-common/iot-base/src/main/java/com/qiuguo/iot/base/enums/DeviceCodeEnum.java @@ -6,7 +6,7 @@ package com.qiuguo.iot.base.enums; * */ // 0:响铃一次(time指定的时间) 1:每天 2:指定星期 public enum DeviceCodeEnum { - BOX(0, "qgbox"), + BOX(0, "28ff210c6e664903a5076b027f23b30b"), ; DeviceCodeEnum(Integer c, String n){ code = c; diff --git a/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/entity/device/DeviceUserBindEntity.java b/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/entity/device/DeviceUserBindEntity.java index 2eb1bb9..0fc1c63 100644 --- a/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/entity/device/DeviceUserBindEntity.java +++ b/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/entity/device/DeviceUserBindEntity.java @@ -88,7 +88,7 @@ public class DeviceUserBindEntity extends GenericEntity { @Comment("乡镇以下地址") @Column(name = "address", length = 200) private String address; - @Comment("分类字段名称") + @Comment("分类字段名称。当为果Box代表通义星尘角色id") @Column(name = "category_code", length = 20, nullable = false) private String categoryCode; diff --git a/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/request/qwen/TongYiCommunicationRest.java b/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/request/qwen/TongYiCommunicationRest.java index f8cde51..bf9cb2d 100644 --- a/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/request/qwen/TongYiCommunicationRest.java +++ b/iot-common/iot-data/src/main/java/com/qiuguo/iot/data/request/qwen/TongYiCommunicationRest.java @@ -7,6 +7,14 @@ public class TongYiCommunicationRest { private Integer isWhiteList;//是否为白名单 private String text;//消息 private String onlyId;//唯一编码 + /** + * 星尘角色id + */ + private String roleId; + /** + * 用户昵称 + */ + private String nickName; private String status; //状态,0:已完成,1.未发起,2.发起中 /** diff --git a/iot-common/iot-third/pom.xml b/iot-common/iot-third/pom.xml index 4b05594..1d9eeec 100644 --- a/iot-common/iot-third/pom.xml +++ b/iot-common/iot-third/pom.xml @@ -87,6 +87,14 @@ 2.5.1 + + + com.alibaba.xingchen + xingchen-java-client + 1.0.2 + compile + + diff --git a/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/nlp/AliYunXingChen.java b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/nlp/AliYunXingChen.java new file mode 100644 index 0000000..84f3a1d --- /dev/null +++ b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/nlp/AliYunXingChen.java @@ -0,0 +1,112 @@ +package com.qiuguo.iot.third.nlp; + +import com.alibaba.dashscope.aigc.generation.Generation; +import com.alibaba.dashscope.aigc.generation.GenerationResult; +import com.alibaba.dashscope.aigc.generation.models.QwenParam; +import com.alibaba.dashscope.common.MessageManager; +import com.alibaba.dashscope.common.ResultCallback; +import com.alibaba.dashscope.common.Role; +import com.alibaba.xingchen.ApiClient; +import com.alibaba.xingchen.api.ChatApiSub; +import com.alibaba.xingchen.auth.HttpBearerAuth; +import com.alibaba.xingchen.model.*; +import com.qiuguo.iot.data.resp.qg.algorithm.QWenReplyResponse; +import com.qiuguo.iot.third.service.IQianWen; +import io.reactivex.Flowable; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import reactor.core.publisher.Mono; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Semaphore; + +@Data +@Slf4j +public class AliYunXingChen { + @Data + class RecordMessage{ + String msg = ""; + } + /** + * + */ + ChatApiSub api; + + + List messages = new ArrayList<>(50); + + + ChatReqParams chatReqParams; + String userName; + public AliYunXingChen(String basePath, String key, String roleId, String userId, String userName) { + api = new ChatApiSub(); + ApiClient apiClient = new ApiClient(); + apiClient.setBasePath(basePath); + // 开启SSE输出 + apiClient.addDefaultHeader("X-DashScope-SSE", "enable"); + + // Configure HTTP bearer authorization: Authorization + HttpBearerAuth authorization = (HttpBearerAuth) apiClient.getAuthentication("Authorization"); + authorization.setBearerToken(key); + api.setApiClient(apiClient); + this.userName = userName; + chatReqParams = ChatReqParams.builder() + .botProfile( + CharacterKey.builder() + // 星尘预制角色 + .characterId(roleId) + .version(1) + .build() + ) + .modelParameters( + ModelParameters.builder() + .seed(1683806810L) + .topP(0.8) + .temperature(0.8) + .build() + ) + .userProfile( + UserProfile.builder() + .userId(userId) + .build() + ).build(); + } + public Mono sendMessage(String msg, + IQianWen onNext){ + Message message = Message.builder().name(userName).role("user").content(msg).build(); + addMessage(message); + chatReqParams.setMessages(messages); + return Mono.defer(() -> { + try { + Flowable response = api.streamOut(chatReqParams); + RecordMessage recordMessage = new RecordMessage(); + response.forEach(m -> { + String v = m.getChoices().get(0).getMessages().get(0).getContent().replaceAll(recordMessage.getMsg(), ""); + onNext.sendMessage(v); + if("stop".equals(m.getChoices().get(0).getStopReason())){ + // + + Message message1 = Message.builder() + .role(m.getChoices().get(0).getMessages().get(0).getRole()) + .content(m.getChoices().get(0).getMessages().get(0).getContent()) + .build(); + addMessage(message1); + onNext.finish(); + } + }); + }catch (Exception e){ + log.info("调用星尘异常{}", e); + } + return Mono.just(true); + }); + + } + + private void addMessage(Message msg){ + if(messages.size() >= 50){ + messages.remove(0); + } + messages.add(msg); + } +} diff --git a/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/service/TongYiXinChenService.java b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/service/TongYiXinChenService.java new file mode 100644 index 0000000..68ddd34 --- /dev/null +++ b/iot-common/iot-third/src/main/java/com/qiuguo/iot/third/service/TongYiXinChenService.java @@ -0,0 +1,57 @@ +package com.qiuguo.iot.third.service; + +import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.qiuguo.iot.base.constans.RedisConstans; +import com.qiuguo.iot.base.utils.StringUtils; +import com.qiuguo.iot.base.utils.WebClientUtils; +import com.qiuguo.iot.data.dto.queue.QueuePackagingDTO; +import com.qiuguo.iot.data.request.qwen.TongYiCommunicationRest; +import com.qiuguo.iot.data.resp.qg.algorithm.QGResponse; +import com.qiuguo.iot.data.resp.qg.algorithm.QWenReplyResponse; +import com.qiuguo.iot.third.nlp.AliYunQianWen; +import com.qiuguo.iot.third.nlp.AliYunXingChen; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.ReactiveStringRedisTemplate; +import org.springframework.data.redis.core.ReactiveValueOperations; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import reactor.core.publisher.Mono; + +import javax.annotation.Resource; +import java.time.Duration; +import java.util.Date; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class TongYiXinChenService { + + + + protected static ConcurrentHashMap qianwenGroup = new ConcurrentHashMap<>(); + + + public Mono communication(TongYiCommunicationRest rest, IQianWen onNext){ + AliYunXingChen aliXingChen = null; + if (!qianwenGroup.containsKey(rest.getOnlyId())) { + aliXingChen = new AliYunXingChen(SpringUtil.getProperty("Ali.xingchen.basepath"), + SpringUtil.getProperty("Ali.xingchen.key"), + rest.getRoleId(), rest.getOnlyId(), rest.getNickName()); + qianwenGroup.put(rest.getOnlyId(), aliXingChen); + } else { + aliXingChen = qianwenGroup.get(rest.getOnlyId()); + } + QWenReplyResponse qWenReplyResponse = new QWenReplyResponse(); + return aliXingChen.sendMessage(rest.getText(), onNext).flatMap(b -> { + return Mono.just(qWenReplyResponse); + }); + + } + +} diff --git a/iot-modules/iot-box-websocket-api/pom.xml b/iot-modules/iot-box-websocket-api/pom.xml index 7b76620..4c303de 100644 --- a/iot-modules/iot-box-websocket-api/pom.xml +++ b/iot-modules/iot-box-websocket-api/pom.xml @@ -106,13 +106,7 @@ tea-openapi 0.2.5 - - - com.alibaba.xingchen - xingchen-java-client - 1.0.2 - compile - + diff --git a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/command/ActionCommand.java b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/command/ActionCommand.java index cf33ff4..97512c7 100644 --- a/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/command/ActionCommand.java +++ b/iot-modules/iot-box-websocket-api/src/main/java/com/qiuguo/iot/box/websocket/api/command/ActionCommand.java @@ -124,11 +124,14 @@ public abstract class ActionCommand { tongYiCommunicationRest.setText(action.getAsk()); tongYiCommunicationRest.setStatus("2"); tongYiCommunicationRest.setRequestId(baseSession.getRequestId()); - if(baseSession instanceof BoxSession){ + //调用星尘 + tongYiCommunicationRest.setOnlyId(baseSession.getUserId().toString()); + //下面是调用千问 + /*if(baseSession instanceof BoxSession){ tongYiCommunicationRest.setOnlyId(baseSession.getSn()); }else{ tongYiCommunicationRest.setOnlyId(baseSession.getUserId().toString()); - } + }*/ QueueMessage queueMessage = new QueueMessage(); diff --git a/iot-modules/iot-box-websocket-api/src/main/resources/bootstrap-dev.yml b/iot-modules/iot-box-websocket-api/src/main/resources/bootstrap-dev.yml index e32187f..1803150 100644 --- a/iot-modules/iot-box-websocket-api/src/main/resources/bootstrap-dev.yml +++ b/iot-modules/iot-box-websocket-api/src/main/resources/bootstrap-dev.yml @@ -58,4 +58,7 @@ lac: Ali: qianwen: 'sk-8d64677afaf6404cb83ce1910b5b2558' accesskeId: 'LTAI5t7d1iZb18SvGQhtDnyN' - accesskeySecret: 'j2Cp3uCDGuiA7xZIJmYOCmDhJl9HuJ' \ No newline at end of file + accesskeySecret: 'j2Cp3uCDGuiA7xZIJmYOCmDhJl9HuJ' + xingchen: + key: 'lm-dIINta/ISx0/8aZK5xKt/A==' + basepath: https://nlp.aliyuncs.com \ No newline at end of file