Commit 6b8fd9bc authored by 赵啸非's avatar 赵啸非

修改配置文件

parent d77ca5b1
......@@ -193,13 +193,9 @@
<artifactId>poi-tl</artifactId>
<version>1.12.0</version>
</dependency>
<!--
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>5.3.18</version>
<scope>provided</scope>
</dependency>-->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
......@@ -217,7 +213,11 @@
<version>2.2</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
......
package com.mortals.xhx.base.system.message.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.mortals.framework.service.ICacheService;
import com.mortals.xhx.base.system.message.MessageService;
import com.mortals.xhx.busiz.rsp.ApiResp;
import com.mortals.xhx.webflux.req.RobotTransReq;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.Delta;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
......
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
/**
* @author karlhoo
*/
@Data
public class ApiResp<T> {
/**
* 结果编码
*/
private int code;
/**
* 结果描述
*/
private String msg;
/**
* 响应数据
*/
private T data;
}
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class AudioItem{
private String src;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class ButtonItem{
private String link;
private String text;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class CustomItem{
private String type;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import java.util.List;
import lombok.Data;
@Data
public class Feed{
private List<ButtonItem> button;
private List<ImageItem> image;
private List<RelateItem> relate;
private String confidence;
private List<CustomItem> custom;
private String source;
private List<VideoItem> video;
private List<AudioItem> audio;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class ImageItem{
private String src;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class NlpItem{
private Feed feed;
private Slots slots;
private String agent;
private String domain;
private String action;
private String source;
private String intent;
private String englishDomain;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class RelateItem{
private String score;
private String src;
private String text;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import java.util.List;
import lombok.Data;
@Data
public class RobotTransResp{
private List<NlpItem> nlp;
private String query;
private String sn;
private int status;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class Slots{
private String answer;
}
\ No newline at end of file
package com.mortals.xhx.busiz.rsp;
import lombok.Data;
@Data
public class VideoItem{
private String src;
}
\ No newline at end of file
package com.mortals.xhx.thread;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.mortals.xhx.webflux.factory.FlowChatContext;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import java.util.Date;
/**
* 机器人响应消息
*
* @author: zxfei
* @date: 2025/3/19 20:36
*/
@AllArgsConstructor
@Slf4j
public class ChatMsgRspThread implements Runnable {
private FlowChatContext context;
/**
* 最大重试次数
*/
public final Integer MAX_RETRY_COUNT = 10;
@Override
public void run() {
log.info("快速响应线程开始,msgId:{}", context.getMsgId());
StringBuilder answer = context.getAnswer();
int reCount = 0;
while (reCount < MAX_RETRY_COUNT) {
if (!answer.toString().isEmpty()) {
log.info("快速响应线程结束 answer:{}", answer);
break;
}
//创建一个初始化的answer
JSONObject rspJson = new JSONObject();
rspJson.put("id", context.getMsgId());
rspJson.put("created", new Date().getTime());
rspJson.put("model", "");
JSONArray jsonArray = new JSONArray();
JSONObject obj = new JSONObject();
JSONObject delta = new JSONObject();
delta.put("role", "");
if(reCount == 0){
delta.put("role", "assistant");
}
delta.put("content", "");
obj.put("delta", delta);
obj.put("index", 0);
obj.put("finish_reason", "null");
jsonArray.add(obj);
rspJson.put("choices", jsonArray);
rspJson.put("object", "");
context.getEmitter().next(rspJson.toJSONString());
reCount++;
try {
Thread.sleep(1000);
} catch (InterruptedException interruptedException) {
}
}
}
}
......@@ -56,12 +56,14 @@ public class FlowChatSubscriber implements Subscriber<String>, Disposable {
@Override
public void onNext(String data) {
String rsp = "";
try {
data = callBack.onNext(data, context);
if(ObjectUtils.isEmpty(data)){
this.stopFlag=true;
rsp = callBack.onNext(data, context);
if (ObjectUtils.isEmpty(rsp)) {
this.stopFlag = true;
}
log.info(" onNext data:{}", data);
// log.info(" onNext rsp:{}", rsp);
} catch (Exception e) {
log.error("流式问答异常:{}", e.getMessage());
} finally {
......@@ -72,12 +74,43 @@ public class FlowChatSubscriber implements Subscriber<String>, Disposable {
subscription.cancel();
onComplete();
} else {
// emitter.(msg);
// 将数据发送给前端 如果是起始包 需要要处理一下
emitter.next(data);
emitter.next(rsp);
// 继续请求接收下一个数据项
subscription.request(1);
}
}
/* new Thread(() -> { // 需要异步执行,否则会阻塞
String rsp = "";
try {
rsp = callBack.onNext(data, context);
if (ObjectUtils.isEmpty(rsp)) {
this.stopFlag = true;
}
log.info(" onNext rsp:{}", rsp);
} catch (Exception e) {
log.error("流式问答异常:{}", e.getMessage());
} finally {
// todo 临时打印日志
// log.info("=============== data: {}", data);
if (stopFlag) {
log.info("stopFlag is true");
subscription.cancel();
onComplete();
} else {
// emitter.(msg);
// 将数据发送给前端 如果是起始包 需要要处理一下
emitter.next(rsp);
// 继续请求接收下一个数据项
subscription.request(1);
}
}
}).start();*/
}
@Override
......
......@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.util.Date;
import java.util.HashMap;
......@@ -54,15 +55,14 @@ public class BaseChatService extends AbstractFlowChatTemplate {
if (StrUtil.equals("[DONE]", data)) {//[DONE]是消息结束标识
return null;
}
// 解析响应数据项
JSONObject bodyJson = JSONObject.parseObject(data);
if (bodyJson == null) {
return data;
}
// String id = bodyJson.getString("id");
if (num == 0) {
/*if(ObjectUtils.isEmpty(context.getAnswer())){
//创建一个初始化的answer
JSONObject rspJson = new JSONObject();
rspJson.put("id", context.getMsgId());
rspJson.put("created", new Date().getTime());
......@@ -83,17 +83,22 @@ public class BaseChatService extends AbstractFlowChatTemplate {
rspJson.put("choices", jsonArray);
rspJson.put("object", "");
num++;
context.getAnswer().append(".");
context.getEmitter().next(rspJson.toJSONString());
}
/* String status = bodyJson.getString("status");
if ("running".equals(status)) {
//计数器重置
//this.num=0;
//构建第一个数据响应包
*/
// context.getAnswer().append(answer);
// String id = bodyJson.getString("id");
/* if (num == 0) {
JSONObject rspJson = new JSONObject();
rspJson.put("id", context.getMsgId());
rspJson.put("created", new Date().getTime());
rspJson.put("model", "");
JSONArray jsonArray = new JSONArray();
JSONObject obj = new JSONObject();
......@@ -102,9 +107,15 @@ public class BaseChatService extends AbstractFlowChatTemplate {
delta.put("role", "assistant");
delta.put("content", "");
obj.put("delta", delta);
obj.put("index", 0);
obj.put("finish_reason", "null");
jsonArray.add(obj);
rspJson.put("delta", jsonArray);
return rspJson.toJSONString();
rspJson.put("choices", jsonArray);
rspJson.put("object", "");
num++;
context.getEmitter().next(rspJson.toJSONString());
}*/
JSONArray choices = bodyJson.getJSONArray("choices");
......
package com.mortals.xhx.webflux.template;
import com.mortals.framework.util.ThreadPool;
import com.mortals.xhx.thread.ChatMsgRspThread;
import com.mortals.xhx.webflux.common.CommonError;
import com.mortals.xhx.webflux.common.JsonUtils;
import com.mortals.xhx.webflux.factory.*;
......@@ -57,6 +59,11 @@ public abstract class AbstractFlowChatTemplate implements IFlowChat, FlowChatCal
log.info("subscriberMap in AbstractChatService after put: " + JsonUtils.toJson(subscriberMap));
response.subscribe(subscriber);
emitter.onDispose(subscriber);
ChatMsgRspThread chatMsgRspThread = new ChatMsgRspThread(context);
ThreadPool.getInstance().execute(chatMsgRspThread);
});
}
......@@ -104,7 +111,7 @@ public abstract class AbstractFlowChatTemplate implements IFlowChat, FlowChatCal
*/
private Flux<String> doRequest(FlowChatContext context, FLowChatRequest request, HttpHeaders headers) {
log.info("请求大模型开始,URL:{}, 参数:{}", request.getUrl(), request.getJsonBody());
return webClient.post()
Flux<String> flux = webClient.post()
.uri(request.getUrl())
.accept(MediaType.TEXT_EVENT_STREAM)
.headers(httpHeaders -> httpHeaders.addAll(headers))
......@@ -121,6 +128,11 @@ public abstract class AbstractFlowChatTemplate implements IFlowChat, FlowChatCal
log.error("系统异常", ex);
return Flux.just(JsonUtils.toJson(buildAnswer(CommonError.GLOBAL_ERROR.getMsg())));
});
//如果一定时间未收到响应,则模拟响应数据回写
return flux;
}
/**
......
......@@ -32,7 +32,7 @@ public class TestRot {
" \"messages\": [\n" +
" {\n" +
" \"role\": \"user\",\n" +
" \"content\": \"今天天气怎么样?\"\n" +
" \"content\": \"你有什么能力?\"\n" +
" }\n" +
" ],\n" +
" \"max_tokens\": 2048,\n" +
......@@ -51,7 +51,7 @@ public class TestRot {
Request request = new Request.Builder()
.url("http://localhost:18006/chat/base")
// .url("http://robot.scsmile.cn/chat/base")
//.url("http://robot.scsmile.cn/chat/base")
.headers(headers)
.post(requestBody)
.build();
......
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