作者 钟来

模块整理

... ... @@ -55,7 +55,7 @@ public class ChatController {
@ResponseBody
public ChatResponse sseChat(@RequestBody ChatRequest chatRequest, @RequestHeader Map<String, String> headers, HttpServletResponse response) {
String uid = getUid(headers);
return sseService.sseChat(uid, chatRequest, ChatCompletion.Model.GPT_3_5_TURBO_0301,null);
return sseService.sseChat(true,0,uid, chatRequest, ChatCompletion.Model.GPT_3_5_TURBO_0301,null);
}
/**
... ...
... ... @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import com.unfbx.chatgpt.entity.chat.ChatCompletionResponse;
import com.unfbx.chatgpt.entity.chat.Message;
import com.zhonglai.luhui.chatgpt.event.MyEvent;
import com.zhonglai.luhui.chatgpt.service.CompleteCallback;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import okhttp3.Response;
... ... @@ -28,8 +29,16 @@ public class OpenAISSEEventSourceListener extends EventSourceListener {
private SseEmitter sseEmitter;
public OpenAISSEEventSourceListener(SseEmitter sseEmitter) {
private StringBuffer contents = new StringBuffer();
private CompleteCallback completeCallback;
private boolean isHaveData;
private int recordId;
public OpenAISSEEventSourceListener(SseEmitter sseEmitter, CompleteCallback completeCallback,int recordId) {
this.sseEmitter = sseEmitter;
this.completeCallback = completeCallback;
this.recordId = recordId;
}
/**
... ... @@ -73,8 +82,14 @@ public class OpenAISSEEventSourceListener extends EventSourceListener {
Message delta = completionResponse.getChoices().get(0).getDelta();
if(null != delta.getContent())
{
if(isHaveData)
{
sseEmitter.send(delta.getContent(), MediaType.TEXT_EVENT_STREAM);
}else{
sseEmitter.send(new MyEvent().data(delta.getContent(), MediaType.TEXT_EVENT_STREAM));
}
contents.append(delta.getContent());
}
// sseEmitter.send(SseEmitter.event()
// .id(completionResponse.getId())
// .data(delta.getContent())
... ... @@ -92,6 +107,10 @@ public class OpenAISSEEventSourceListener extends EventSourceListener {
public void onClosed(EventSource eventSource) {
log.info("流式输出返回值总共{}tokens", tokens() - 2);
log.info("OpenAI关闭sse连接...");
if(null != completeCallback)
{
completeCallback.sseChatEnd(recordId,tokens,contents.toString());
}
}
... ... @@ -117,4 +136,13 @@ public class OpenAISSEEventSourceListener extends EventSourceListener {
public long tokens() {
return tokens;
}
public String contents()
{
return contents.toString();
}
public void setHaveData(boolean haveData) {
isHaveData = haveData;
}
}
... ...
package com.zhonglai.luhui.chatgpt.service;
import com.unfbx.chatgpt.entity.chat.ChatCompletion;
import com.zhonglai.luhui.chatgpt.controller.request.ChatRequest;
import com.zhonglai.luhui.chatgpt.listener.OpenAISSEEventSourceListener;
public interface CompleteCallback {
void sseChatEnd(ChatCompletion chatCompletion, OpenAISSEEventSourceListener openAISSEEventSourceListener);
void sseChatEnd(int recordId,long tokens,String contents);
int recordSseChat(Integer user_id, ChatRequest chatRequest, ChatCompletion chatCompletion);
}
... ...
... ... @@ -30,5 +30,5 @@ public interface SseService {
* @param uid
* @param chatRequest
*/
ChatResponse sseChat(String uid, ChatRequest chatRequest, ChatCompletion.Model model, CompleteCallback completeCallback);
ChatResponse sseChat(Boolean isHaveData,Integer user_id,String uid, ChatRequest chatRequest, ChatCompletion.Model model, CompleteCallback completeCallback);
}
... ...
... ... @@ -87,7 +87,7 @@ public class SseServiceImpl implements SseService {
}
@Override
public ChatResponse sseChat(String uid, ChatRequest chatRequest, ChatCompletion.Model model, CompleteCallback completeCallback) {
public ChatResponse sseChat(Boolean isHaveData,Integer user_id,String uid, ChatRequest chatRequest, ChatCompletion.Model model, CompleteCallback completeCallback) {
if (ArrayUtil.isEmpty(chatRequest.getMsg())) {
log.info("参数异常,msg为null", uid);
throw new BaseException("参数异常,msg不能为空~");
... ... @@ -120,20 +120,27 @@ public class SseServiceImpl implements SseService {
log.info("聊天消息推送失败uid:[{}],没有创建连接,请重试。", uid);
throw new BaseException("聊天消息推送失败uid:[{}],没有创建连接,请重试。~");
}
OpenAISSEEventSourceListener openAIEventSourceListener = new OpenAISSEEventSourceListener(sseEmitter);
log.info("{}加载监听业务", uid);
ChatCompletion completion = ChatCompletion
.builder()
.messages(messages)
.model(model.getName())
.build();
int recordId = 0;
if(null != completeCallback)
{
recordId = completeCallback.recordSseChat(user_id,chatRequest,completion);
}
OpenAISSEEventSourceListener openAIEventSourceListener = new OpenAISSEEventSourceListener(sseEmitter,completeCallback,recordId);
openAIEventSourceListener.setHaveData(isHaveData);
openAiStreamClient.streamChatCompletion(completion, openAIEventSourceListener);
// LocalCache.CACHE.put("msg" + uid, JSONUtil.toJsonStr(messages), LocalCache.TIMEOUT);
ChatResponse response = new ChatResponse();
response.setQuestionTokens(completion.tokens());
if(null != completeCallback)
{
completeCallback.sseChatEnd(completion,openAIEventSourceListener);
}
return response;
}
}
... ...
... ... @@ -2,9 +2,14 @@ package com.zhonglai.luhui.openai;
import com.ruoyi.common.utils.StringUtils;
import okhttp3.OkHttpClient;
import org.apache.tomcat.util.http.LegacyCookieProcessor;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.web.embedded.tomcat.TomcatContextCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import java.net.URL;
... ... @@ -27,4 +32,11 @@ public class OpenaiApplication {
SpringApplication.run(OpenaiApplication.class,args);
System.out.println("启动成功");
}
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> cookieProcessorCustomizer() {
return tomcatServletWebServerFactory -> tomcatServletWebServerFactory.addContextCustomizers((TomcatContextCustomizer) context -> {
context.setCookieProcessor(new LegacyCookieProcessor());
});
}
}
... ...
... ... @@ -38,12 +38,11 @@ import java.util.concurrent.TimeUnit;
@RequestMapping("/chatGPTStream")
public class ChatGPTStreamController extends BaseController {
private static String sessionkey = "CHAT_HISTORY_CONTEXT";//上下文关联存放地址
@Autowired
private PublicService publicService;
@Autowired
private VipServiceImpl vipService;
@Autowired
private CompleteCallback completeCallback;
@Autowired
private ScheduledExecutorService scheduledExecutorService;
private final SseService sseService;
... ... @@ -67,23 +66,13 @@ public class ChatGPTStreamController extends BaseController {
OpenAiLoginUser userInfo = (OpenAiLoginUser) SecurityUtils.getLoginUser();
Integer user_id= SecurityUtils.getUserId().intValue();
String room_id = String.valueOf(user_id);
String uid = UUID.randomUUID().toString();
SseEmitter sseEmitter = sseService.createSse(uid);
scheduledExecutorService.schedule(() -> {
try{
BigDecimal[] bs = vipService.getUnitprice();
BigDecimal openaiUnitprice = bs[0];
BigDecimal realityUnitprice = bs[1];
if(openaiUnitprice.doubleValue()==0 || realityUnitprice.doubleValue()==0)
{
throw new BaseException("系统未配置流量单价,请联系管理员");
}
OpenAiUserInfo openAiUserInfo = (OpenAiUserInfo) userInfo.getUser();
//验证余额是否充足
if(vipService.isCharging(openAiUserInfo.getVip_level()) && openAiUserInfo.getFlow_packet_remain()<=0)
{
... ... @@ -95,56 +84,57 @@ public class ChatGPTStreamController extends BaseController {
completionChoiceMessage3_5.setContent(stringBuffer.toString());
throw new BaseException("您的余额不足请联系管理员或者充值");
}
sseService.sseChat(true,user_id,uid, chatRequest, chatRequest.getModel(),completeCallback);
}catch (Exception e)
{
log.error("主业务流程异常",e);
try {
String estr = e.getMessage();
if(null == estr)
{
estr = "系统异常,请联系管理员";
}
sseEmitter.send(estr, MediaType.TEXT_EVENT_STREAM);
} catch (IOException ex) {
log.error("sse信息推送失败!");
e.printStackTrace();
}
sseService.closeSse(uid);
}
CompleteCallback completeCallback = (chatCompletion, openAISSEEventSourceListener) -> {
GptMessage gptMessage = new GptMessage();
gptMessage.setRoom_id(room_id);
gptMessage.setUser_id(user_id);
gptMessage.setCreate_time(DateUtils.getNowTimeMilly());
gptMessage.setSend_role("user");
StringBuffer content = new StringBuffer();
for (com.unfbx.chatgpt.entity.chat.Message messge : chatCompletion.getMessages()) {
content.append(messge.getContent());
},1, TimeUnit.SECONDS);
return sseEmitter;
}
gptMessage.setSend_content(content.toString());
gptMessage.setSend_size(gptMessage.getSend_content().length());
//统计代币
gptMessage.setCompletion_tokens(UnitPriceCountUtil.countToken(chatRequest.getModel(),openAISSEEventSourceListener.tokens(),UnitPriceCountUtil.FlowType.Completion));
gptMessage.setPrompt_tokens(UnitPriceCountUtil.countToken(chatRequest.getModel(),chatCompletion.tokens(),UnitPriceCountUtil.FlowType.Completion));
gptMessage.setTotal_tokens(gptMessage.getCompletion_tokens() + gptMessage.getPrompt_tokens());
gptMessage.setMessage_role(chatCompletion.getMessages().get(0).getRole());
// gptMessage.setMessage_content(openAISSEEventSourceListener.contents());
gptMessage.setMessage_size(Long.valueOf(openAISSEEventSourceListener.tokens()).intValue());
publicService.insertToTable(gptMessage, "`lk_openai`.`gpt_message`");
UserFlowPacketRemainLog userFlowPacketRemainLog = new UserFlowPacketRemainLog();
userFlowPacketRemainLog.setCreate_time(DateUtils.getNowTimeMilly());
userFlowPacketRemainLog.setUser_id(user_id);
userFlowPacketRemainLog.setType(2); //消费
@ApiOperation(value = "聊天接口返回data")
@Transactional
@PostMapping("/chatNotData")
@ResponseBody
public SseEmitter chatNotData(@RequestBody ChatRequest chatRequest) {
OpenAiLoginUser userInfo = (OpenAiLoginUser) SecurityUtils.getLoginUser();
Integer user_id= SecurityUtils.getUserId().intValue();
String uid = UUID.randomUUID().toString();
SseEmitter sseEmitter = sseService.createSse(uid);
scheduledExecutorService.schedule(() -> {
try{
OpenAiUserInfo openAiUserInfo = (OpenAiUserInfo) userInfo.getUser();
//验证余额是否充足
if(vipService.isCharging(openAiUserInfo.getVip_level()) && openAiUserInfo.getFlow_packet_remain()<=0)
{
CompletionChoiceMessage3_5 completionChoiceMessage3_5 = new CompletionChoiceMessage3_5();
completionChoiceMessage3_5.setRole("assistant");
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("房间号:");
stringBuffer.append(room_id);
stringBuffer.append(";");
stringBuffer.append("发送代币:");
stringBuffer.append(gptMessage.getPrompt_tokens());
stringBuffer.append(";");
stringBuffer.append("返回代币:");
stringBuffer.append(gptMessage.getCompletion_tokens());
stringBuffer.append(";");
userFlowPacketRemainLog.setDescribe(stringBuffer.toString());
userFlowPacketRemainLog.setTotal_tokens(gptMessage.getTotal_tokens());
userFlowPacketRemainLog.setOpenai_money((openaiUnitprice.multiply(new BigDecimal(gptMessage.getTotal_tokens()))).divide(new BigDecimal(1000), 6, BigDecimal.ROUND_HALF_UP));
userFlowPacketRemainLog.setReality_money((realityUnitprice.multiply(new BigDecimal(gptMessage.getTotal_tokens()))).divide(new BigDecimal(1000), 6, BigDecimal.ROUND_HALF_UP));
publicService.insertToTable(userFlowPacketRemainLog, "`lk_openai`.`user_flow_packet_remain_log`");
publicService.updateBySql("UPDATE `lk_openai`.`user_info` SET flow_packet_remain=flow_packet_remain-" + userFlowPacketRemainLog.getTotal_tokens() + " WHERE id=" + openAiUserInfo.getId());
};
sseService.sseChat(uid, chatRequest, chatRequest.getModel(),completeCallback);
stringBuffer.append("您的余额不足请联系管理员或者点击链接充值:\\n\\n");
stringBuffer.append("https://充值链接.com");
completionChoiceMessage3_5.setContent(stringBuffer.toString());
throw new BaseException("您的余额不足请联系管理员或者充值");
}
sseService.sseChat(false,user_id,uid, chatRequest, chatRequest.getModel(),completeCallback);
}catch (Exception e)
{
log.error("主业务流程异常",e);
... ... @@ -166,6 +156,7 @@ public class ChatGPTStreamController extends BaseController {
return sseEmitter;
}
/**
* 关闭连接
*
... ...
... ... @@ -16,6 +16,26 @@ public class GptMessage {
private Long total_tokens; //bigint(20) DEFAULT NULL COMMENT '总代币',
private Integer user_flow_packet_remain_log_id; //用户加油包消费日志id
private String model; //请求模型
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public Integer getUser_flow_packet_remain_log_id() {
return user_flow_packet_remain_log_id;
}
public void setUser_flow_packet_remain_log_id(Integer user_flow_packet_remain_log_id) {
this.user_flow_packet_remain_log_id = user_flow_packet_remain_log_id;
}
public Long getTotal_tokens() {
return total_tokens;
}
... ...
package com.zhonglai.luhui.openai.service;
import com.ruoyi.common.utils.DateUtils;
import com.unfbx.chatgpt.entity.chat.ChatCompletion;
import com.unfbx.chatgpt.exception.BaseException;
import com.zhonglai.luhui.chatgpt.controller.request.ChatRequest;
import com.zhonglai.luhui.chatgpt.listener.OpenAISSEEventSourceListener;
import com.zhonglai.luhui.chatgpt.service.CompleteCallback;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.openai.dto.GptMessage;
import com.zhonglai.luhui.openai.dto.UserFlowPacketRemainLog;
import com.zhonglai.luhui.openai.utils.UnitPriceCountUtil;
import com.zhonglai.luhui.security.dto.OpenAiUserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Arrays;
@Service
public class CompleteCallbackImpl implements CompleteCallback {
@Autowired
private PublicService publicService;
@Autowired
private VipServiceImpl vipService;
@Override
public void sseChatEnd(int recordId,long tokens,String contents) {
BigDecimal[] bs = vipService.getUnitprice();
BigDecimal openaiUnitprice = bs[0];
BigDecimal realityUnitprice = bs[1];
if(openaiUnitprice.doubleValue()==0 || realityUnitprice.doubleValue()==0)
{
throw new BaseException("系统未配置流量单价,请联系管理员");
}
if(0 == recordId)
{
return;
}
GptMessage gptMessage = publicService.getObjectForTableName(GptMessage.class,"id",recordId+"","`lk_openai`.`gpt_message`");
GptMessage upGptMessage = new GptMessage();
gptMessage.setCompletion_tokens(tokens);
upGptMessage.setTotal_tokens(gptMessage.getCompletion_tokens() + gptMessage.getPrompt_tokens());
Arrays.stream(ChatCompletion.Model.values()).forEach(model -> {
if (model.getName().equals(gptMessage.getModel()))
upGptMessage.setCompletion_tokens(UnitPriceCountUtil.countToken(model,tokens,UnitPriceCountUtil.FlowType.Completion));
});
upGptMessage.setMessage_content(contents);
upGptMessage.setMessage_size(upGptMessage.getMessage_content().length());
upGptMessage.setId(gptMessage.getId());
publicService.updateObjectByTable(upGptMessage,"id","`lk_openai`.`gpt_message`");
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("房间号:");
stringBuffer.append(gptMessage.getRoom_id());
stringBuffer.append(";");
stringBuffer.append("发送代币:");
stringBuffer.append(gptMessage.getPrompt_tokens());
stringBuffer.append(";");
stringBuffer.append("返回代币:");
stringBuffer.append(gptMessage.getCompletion_tokens());
stringBuffer.append(";");
UserFlowPacketRemainLog userFlowPacketRemainLog = new UserFlowPacketRemainLog();
userFlowPacketRemainLog.setDescribe(stringBuffer.toString());
userFlowPacketRemainLog.setTotal_tokens(upGptMessage.getTotal_tokens());
userFlowPacketRemainLog.setOpenai_money((openaiUnitprice.multiply(new BigDecimal(upGptMessage.getTotal_tokens()))).divide(new BigDecimal(1000), 6, BigDecimal.ROUND_HALF_UP));
userFlowPacketRemainLog.setReality_money((realityUnitprice.multiply(new BigDecimal(upGptMessage.getTotal_tokens()))).divide(new BigDecimal(1000), 6, BigDecimal.ROUND_HALF_UP));
userFlowPacketRemainLog.setId(gptMessage.getUser_flow_packet_remain_log_id());
publicService.updateObjectByTable(userFlowPacketRemainLog,"id","`lk_openai`.`user_flow_packet_remain_log`");
publicService.updateBySql("UPDATE `lk_openai`.`user_info` SET flow_packet_remain=flow_packet_remain-" + userFlowPacketRemainLog.getTotal_tokens() + " WHERE id=" + gptMessage.getUser_id());
}
@Override
public int recordSseChat(Integer user_id, ChatRequest chatRequest, ChatCompletion chatCompletion) {
String room_id = String.valueOf(user_id);
UserFlowPacketRemainLog userFlowPacketRemainLog = new UserFlowPacketRemainLog();
userFlowPacketRemainLog.setCreate_time(DateUtils.getNowTimeMilly());
userFlowPacketRemainLog.setUser_id(user_id);
userFlowPacketRemainLog.setType(2); //消费
publicService.insertToTable(userFlowPacketRemainLog, "`lk_openai`.`user_flow_packet_remain_log`");
GptMessage gptMessage = new GptMessage();
gptMessage.setRoom_id(room_id);
gptMessage.setUser_id(user_id);
gptMessage.setCreate_time(DateUtils.getNowTimeMilly());
gptMessage.setSend_role("user");
gptMessage.setModel(chatRequest.getModel().getName());
StringBuffer content = new StringBuffer();
for (com.unfbx.chatgpt.entity.chat.Message messge : chatCompletion.getMessages()) {
content.append(messge.getContent());
}
gptMessage.setSend_content(content.toString());
gptMessage.setSend_size(gptMessage.getSend_content().length());
//统计代币
gptMessage.setPrompt_tokens(UnitPriceCountUtil.countToken(chatRequest.getModel(),chatCompletion.tokens(),UnitPriceCountUtil.FlowType.Completion));
gptMessage.setMessage_role(chatCompletion.getMessages().get(0).getRole());
gptMessage.setUser_flow_packet_remain_log_id(userFlowPacketRemainLog.getId());
publicService.insertToTable(gptMessage, "`lk_openai`.`gpt_message`");
return gptMessage.getId();
}
}
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 获取ip地址开关 addressEnabled: false profile: /www/wwwroot/lh-openai # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8082 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # web: # resources: # static-locations: classpath:/static/, classpath:/templates/ # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-openai # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/openAiUserLogin/*,/chatGPTStream/upUserFlowPacketRemain,/createSse,/chat,/closeSse chatgpt: token: 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 timeout: 5000 apiHost: https://api.openai.com/ proxy: isProxy: fales host: 127.0.0.1 port: 7890
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 获取ip地址开关 addressEnabled: false profile: /www/wwwroot/lh-openai # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8082 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # web: # resources: # static-locations: classpath:/static/, classpath:/templates/ # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-openai # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/openAiUserLogin/*,/chatGPTStream/upUserFlowPacketRemain,/createSse,/chat,/closeSse chatgpt: token: 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 timeout: 5000 apiHost: https://api.openai.com/ proxy: isProxy: true host: 127.0.0.1 port: 7890
\ No newline at end of file
... ...