作者 钟来

Default Changelist

正在显示 22 个修改的文件 包含 996 行增加2 行删除
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>Luhui</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>lh-chatgpt-api</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringWeb模块 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<!-- servlet包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-text</artifactId>
</dependency>
<!-- 文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--https://mvnrepository.com/artifact/io.swagger/swagger-models-->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger-models.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
<!--&lt;!&ndash; https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui &ndash;&gt;-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>${swagger-ui.version}</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<!-- 阿里JSON解析器 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
</dependencies>
<build>
<finalName>lh-chatgpt-api</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<!--
生成的jar中,不要包含pom.xml和pom.properties这两个文件
-->
<addMavenDescriptor>false</addMavenDescriptor>
<manifest>
<!--
是否要把第三方jar放到manifest的classpath中
-->
<addClasspath>true</addClasspath>
<!--
生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/
-->
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.zhonglai.luhui.ChatgptApplication</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- The configuration of maven-assembly-plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.4</version>
<configuration>
<descriptors>
<descriptor>src/main/resources/package.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan(basePackages = {
"com.zhonglai.luhui.config",
}
)
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class ChatgptApplication {
public static void main(String[] args) {
SpringApplication.run(ChatgptApplication.class,args);
System.out.println("启动成功");
}
}
... ...
package com.zhonglai.luhui.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 跨域配置,需要和WebMvcConfigurerAdapter的addCorsMappings配合使用
*/
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
corsConfiguration.addAllowedHeader("*"); // 2允许任何头
corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 4
return new CorsFilter(source);
}
}
... ...
package com.zhonglai.luhui.config;
import io.swagger.annotations.ApiOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
.paths(PathSelectors.any())
.build();
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo()
{
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题:lh-chatgpt-api中间件接口文档")
// 描述
.description("描述:chatgpt请求的接口")
// 作者信息
.contact(new Contact("", null, null))
// 版本
.version("版本号:1.1.1" )
.build();
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.controller;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.dto.ChatGPTApiDto;
import com.zhonglai.luhui.dto.ChatRoomMessages;
import com.zhonglai.luhui.dto.CompletionResult3_5;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@Api(tags = "chatGPT接口")
@RestController
@RequestMapping("/chatGPTApi")
public class ChatGPTApiController {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@ApiOperation(value = "测试")
@GetMapping("/sendMessage")
public void sendMessage(HttpServletResponse response, @RequestBody ChatGPTApiDto chatGPTApiDto)
{
// 设置响应内容类型和编码
response.setContentType("text/html;charset=UTF-8");
String str = "";
PrintWriter out = null;
try {
out = response.getWriter();
//验证验证码
if(StringUtils.isNotEmpty(str))
{
for(int i=0;i<str.length();i++)
{
char c = str.charAt(i);
out.write(c);
out.flush(); // 立即将字符输出到客户端
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}finally {
if(null != out)
{
out.close();
}
}
}
private CompletionResult3_5 sendGPTAi(List<ChatRoomMessages> messageList)
{
logger.info("请求内容:{}",messageList);
JSONObject jsonObject = new JSONObject();
jsonObject.put("model","gpt-3.5-turbo-0301");
jsonObject.put("messages",messageList);
String str = HttpUtil.post("https://chatgpt.njlaikun.com/v1/chat/completions",jsonObject.toString());
logger.info("返回的数据:{}",str);
CompletionResult3_5 completionResult = JSONObject.parseObject(str, CompletionResult3_5.class);
return completionResult;
}
/**
* 免费接口
* @param messageList
* @return
*/
private CompletionResult3_5 sendFreeGPTAi(List<ChatRoomMessages> messageList)
{
logger.info("请求内容:{}",messageList);
JSONObject jsonObject = new JSONObject();
jsonObject.put("model","gpt-3.5-turbo-0301");
jsonObject.put("messages",messageList);
String str = HttpUtil.post("https://free.chatgpt.njlaikun.com/v1/chat/completions",jsonObject.toString());
logger.info("返回的数据:{}",str);
CompletionResult3_5 completionResult = JSONObject.parseObject(str, CompletionResult3_5.class);
return completionResult;
}
}
... ...
package com.zhonglai.luhui.dto;
import java.util.List;
public class ChatGPTApiDto {
private List<ChatRoomMessages> messageList;
private Integer user_id;
private String room_id;
private Integer gptMessage_id;
private Boolean isfree;
public Boolean getIsfree() {
return isfree;
}
public void setIsfree(Boolean isfree) {
this.isfree = isfree;
}
public Integer getGptMessage_id() {
return gptMessage_id;
}
public void setGptMessage_id(Integer gptMessage_id) {
this.gptMessage_id = gptMessage_id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getRoom_id() {
return room_id;
}
public void setRoom_id(String room_id) {
this.room_id = room_id;
}
public List<ChatRoomMessages> getMessageList() {
return messageList;
}
public void setMessageList(List<ChatRoomMessages> messageList) {
this.messageList = messageList;
}
}
... ...
package com.zhonglai.luhui.dto;
/**
* 聊天室消息
*/
public class ChatRoomMessages {
private String role; //角色(system “系统”、user “用户”、assistant “助手”)
private String content; //内容(消息的内容)
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
... ...
package com.zhonglai.luhui.dto;
public class CompletionChoice3_5 {
private CompletionChoiceMessage3_5 message;
private String finish_reason;
private Integer index;
public CompletionChoiceMessage3_5 getMessage() {
return message;
}
public void setMessage(CompletionChoiceMessage3_5 message) {
this.message = message;
}
public String getFinish_reason() {
return finish_reason;
}
public void setFinish_reason(String finish_reason) {
this.finish_reason = finish_reason;
}
public Integer getIndex() {
return index;
}
public void setIndex(Integer index) {
this.index = index;
}
}
... ...
package com.zhonglai.luhui.dto;
public class CompletionChoiceMessage3_5 {
private String role;
private String content;
public CompletionChoiceMessage3_5() {
}
public CompletionChoiceMessage3_5(String role, String content) {
this.role = role;
this.content = content;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
... ...
package com.zhonglai.luhui.dto;
import java.util.List;
public class CompletionResult3_5 {
private String id;
private String object;
private Long created;
private String model;
private List<CompletionChoice3_5> choices;
private Usage usage;
private Integer user_id;
private String room_id;
private Integer gptMessage_id;
public Integer getGptMessage_id() {
return gptMessage_id;
}
public void setGptMessage_id(Integer gptMessage_id) {
this.gptMessage_id = gptMessage_id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getObject() {
return object;
}
public void setObject(String object) {
this.object = object;
}
public Long getCreated() {
return created;
}
public void setCreated(Long created) {
this.created = created;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public List<CompletionChoice3_5> getChoices() {
return choices;
}
public void setChoices(List<CompletionChoice3_5> choices) {
this.choices = choices;
}
public Usage getUsage() {
return usage;
}
public void setUsage(Usage usage) {
this.usage = usage;
}
}
... ...
package com.zhonglai.luhui.dto;
public class Usage {
long promptTokens;
long completionTokens;
long totalTokens;
public long getPromptTokens() {
return promptTokens;
}
public void setPromptTokens(long promptTokens) {
this.promptTokens = promptTokens;
}
public long getCompletionTokens() {
return completionTokens;
}
public void setCompletionTokens(long completionTokens) {
this.completionTokens = completionTokens;
}
public long getTotalTokens() {
return totalTokens;
}
public void setTotalTokens(long totalTokens) {
this.totalTokens = totalTokens;
}
}
... ...
##服务器配置
server:
tomcat:
uri-encoding: UTF-8
port: 8086
context-path: /
spring:
messages:
encoding: UTF-8
mvc:
#出现错误时, 直接抛出异常
throw-exception-if-no-handler-found: true
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: non_null
\ No newline at end of file
... ...
log4j.rootLogger=info,indicator,FILE
log4j.appender.indicator=org.apache.log4j.ConsoleAppender
log4j.appender.indicator.layout=org.apache.log4j.PatternLayout
log4j.appender.indicator.layout.ConversionPattern=%d{HH:mm:ss} [%p] %l -%m%n
log4j.appender.FILE = org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File = logs/output.log
log4j.appender.FILE.MaxFileSize = 2000KB
log4j.appender.FILE.MaxBackupIndex = 5
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern = %d{HH:mm:ss} [%p] %l -%m%n
\ No newline at end of file
... ...
<?xml version="1.0" encoding="UTF-8"?>
<assembly>
<id>bin</id>
<!-- 最终打包成一个用于发布的zip文件 -->
<formats>
<format>zip</format>
</formats>
<!-- Adds dependencies to zip package under lib directory -->
<dependencySets>
<dependencySet>
<!--
不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
-->
<useProjectArtifact>false</useProjectArtifact>
<outputDirectory>lib</outputDirectory>
<unpack>false</unpack>
</dependencySet>
</dependencySets>
<fileSets>
<!-- 把项目相关的说明文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.basedir}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>README*</include>
<include>LICENSE*</include>
<include>NOTICE*</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,打包进zip文件的config目录 -->
<fileSet>
<directory>${project.basedir}\src\main\resources\configs</directory>
<outputDirectory>../configs</outputDirectory>
<includes>
<include>*.properties</include>
</includes>
</fileSet>
<!-- 把项目的配置文件,提出来 -->
<fileSet>
<directory>${project.basedir}\src\main\resources</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.properties</include>
<include>*.yml</include>
</includes>
</fileSet>
<!-- 把项目的脚本文件目录( src/main/scripts )中的启动脚本文件,打包进zip文件的跟目录 -->
<fileSet>
<directory>${project.basedir}\bin</directory>
<outputDirectory></outputDirectory>
<includes>
<include>start.*</include>
<include>stop.*</include>
</includes>
</fileSet>
<!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory></outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
\ No newline at end of file
... ...
... ... @@ -99,7 +99,7 @@ public class ChatGPTController extends BaseController {
@ApiOperation(value = "chatgpt3.5",notes = "上下文关联,要实现上下问关联就需要记录整个聊天的提问记录,目前只支持相同session的上下文关联,就是说,如果聊天页面关闭以后再打开,是没有上下文关联的")
@Transactional
@RequestMapping(value = "/chatgptV3_5",method = RequestMethod.POST)
public AjaxResult chatgptV3_5(HttpServletRequest httpServletRequest,@RequestBody String data)
public AjaxResult chatgptV3_5(HttpServletRequest httpServletRequest,@RequestBody ChatgptMessageDto chatgptMessageDto)
{
//跟进用户信息生成入口参数
OpenAiLoginUser userInfo = (OpenAiLoginUser) getLoginUser();
... ... @@ -140,7 +140,7 @@ public class ChatGPTController extends BaseController {
List<ChatRoomMessages> messageList = Optional.ofNullable((List<ChatRoomMessages>) session.getAttribute(sessionkey)).orElse(new ArrayList<>());
ChatRoomMessages chatRoomMessages = new ChatRoomMessages();
chatRoomMessages.setRole("user");
chatRoomMessages.setContent(data);
chatRoomMessages.setContent(chatgptMessageDto.getData());
messageList.add(chatRoomMessages);
session.setAttribute(sessionkey,messageList);
... ...
package com.zhonglai.luhui.openai.controller;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.login.dto.OpenAiLoginUser;
import com.ruoyi.system.login.dto.OpenAiUserInfo;
import com.ruoyi.system.service.PublicService;
import com.theokanning.openai.Usage;
import com.zhonglai.luhui.openai.dto.*;
import com.zhonglai.luhui.openai.service.VipServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import okhttp3.*;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
@Api(tags = "chatGPT流接口")
@RestController
@RequestMapping("/chatGPTStream")
public class ChatGPTStreamController extends BaseController {
private static String sessionkey = "CHAT_HISTORY_CONTEXT";//上下文关联存放地址
@Autowired
private PublicService publicService;
@Autowired
private VipServiceImpl vipService;
@ApiOperation(value = "chatgpt3.5",notes = "上下文关联,要实现上下问关联就需要记录整个聊天的提问记录,目前只支持相同session的上下文关联,就是说,如果聊天页面关闭以后再打开,是没有上下文关联的")
@Transactional
@RequestMapping(value = "/chatgptV3_5",method = RequestMethod.POST)
public void chatgptV3_5(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @RequestBody ChatgptMessageDto chatgptMessageDto) throws IOException {
//跟进用户信息生成入口参数
OpenAiLoginUser userInfo = (OpenAiLoginUser) getLoginUser();
Integer user_id= userInfo.getUserId().intValue();
String room_id = String.valueOf(user_id);
OpenAiUserInfo openAiUserInfo = (OpenAiUserInfo) userInfo.getUser();
PrintWriter out = httpServletResponse.getWriter();
//验证余额是否充足
if(vipService.isCharging(openAiUserInfo.getVip_level()) && openAiUserInfo.getFlow_packet_remain()<=0)
{
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("您的余额不足请联系管理员或者点击链接充值:\\n\\n");
stringBuffer.append("https://充值链接.com");
out.write(stringBuffer.toString());
return;
}
BigDecimal[] bs = vipService.getUnitprice();
BigDecimal openaiUnitprice = bs[0];
BigDecimal realityUnitprice = bs[1];
if(openaiUnitprice.doubleValue()==0 || realityUnitprice.doubleValue()==0)
{
out.write("系统未配置流量单价,请联系管理员");
return;
}
logger.info("{}生成聊天会话:",room_id);
//上下文关联
HttpSession session = httpServletRequest.getSession();
List<ChatRoomMessages> messageList = Optional.ofNullable((List<ChatRoomMessages>) session.getAttribute(sessionkey)).orElse(new ArrayList<>());
ChatRoomMessages chatRoomMessages = new ChatRoomMessages();
chatRoomMessages.setRole("user");
chatRoomMessages.setContent(chatgptMessageDto.getData());
messageList.add(chatRoomMessages);
session.setAttribute(sessionkey,messageList);
GptMessage gptMessage = new GptMessage();
gptMessage.setRoom_id(room_id);
gptMessage.setUser_id(user_id);
gptMessage.setSend_role(chatRoomMessages.getRole());
gptMessage.setSend_content(chatRoomMessages.getContent());
gptMessage.setCreate_time(DateUtils.getNowTimeMilly());
publicService.insertToTable(gptMessage,"`lk_openai`.`gpt_message`");
//获取返回参数
ChatGPTApiDto chatGPTApiDto = new ChatGPTApiDto();
chatGPTApiDto.setGptMessage_id(gptMessage.getId());
chatGPTApiDto.setMessageList(messageList);
chatGPTApiDto.setUser_id(user_id);
chatGPTApiDto.setRoom_id(room_id);
chatGPTApiDto.setIsfree(vipService.isfree(openAiUserInfo.getVip_level()));
HttpUtil.post("https://chatgpt.njlaikun.com/chatGPTApi/sendMessage", JSONObject.toJSONString(chatGPTApiDto));
Request request = new Request.Builder()
.url("https://chatgpt.njlaikun.com/chatGPTApi/sendMessage")
.post(okhttp3.RequestBody.create(JSONObject.toJSONString(chatGPTApiDto), MediaType.parse("application/json;")))
.build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
InputStream inputStream = response.body().byteStream();
}
});
}
@ApiOperation(value = "历史记录",notes = "默认获取最新5条记录")
@Transactional
@RequestMapping(value = "/upUserFlowPacketRemain",method = RequestMethod.POST)
public AjaxResult upUserFlowPacketRemain(@RequestBody CompletionResult3_5 completionResult3_5 )
{
Usage usage = completionResult3_5.getUsage();
List<CompletionChoice3_5> list3_5 = completionResult3_5.getChoices();
if(null != list3_5 && list3_5.size() !=0 )
{
GptMessage gptMessage = new GptMessage();
gptMessage.setSend_size(0);
gptMessage.setPrompt_tokens(0l);
gptMessage.setCompletion_tokens(0l);
gptMessage.setTotal_tokens(0l);
gptMessage.setMessage_size(0);
for (CompletionChoice3_5 completionChoice:list3_5)
{
gptMessage.setSend_size(gptMessage.getSend_size()+gptMessage.getSend_content().length());
//统计代币
gptMessage.setCompletion_tokens(gptMessage.getCompletion_tokens()+usage.getCompletionTokens());
gptMessage.setPrompt_tokens(gptMessage.getPrompt_tokens()+usage.getPromptTokens());
gptMessage.setTotal_tokens(gptMessage.getTotal_tokens()+usage.getTotalTokens());
if(null != completionChoice.getMessage())
{
gptMessage.setMessage_role(completionChoice.getMessage().getRole());
}
if(null != gptMessage.getMessage_content())
{
gptMessage.setMessage_size(gptMessage.getMessage_size()+gptMessage.getMessage_content().length());
}
}
gptMessage.setId(completionResult3_5.getGptMessage_id());
publicService.updateObjectByTable(gptMessage,"id","`lk_openai`.`gpt_message`");
publicService.updateBySql("UPDATE `lk_openai`.`user_info` SET flow_packet_remain=flow_packet_remain-"+usage.getTotalTokens()+" WHERE id="+completionResult3_5.getUser_id());
UserFlowPacketRemainLog userFlowPacketRemainLog = new UserFlowPacketRemainLog();
userFlowPacketRemainLog.setCreate_time(DateUtils.getNowTimeMilly());
userFlowPacketRemainLog.setUser_id(completionResult3_5.getUser_id());
userFlowPacketRemainLog.setType(2); //消费
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("房间号:");
stringBuffer.append(completionResult3_5.getRoom_id());
stringBuffer.append(";");
stringBuffer.append("发送代币:");
stringBuffer.append(usage.getPromptTokens());
stringBuffer.append(";");
stringBuffer.append("返回代币:");
stringBuffer.append(usage.getCompletionTokens());
stringBuffer.append(";");
userFlowPacketRemainLog.setDescribe(stringBuffer.toString());
userFlowPacketRemainLog.setTotal_tokens(usage.getTotalTokens());
BigDecimal[] bs = vipService.getUnitprice();
BigDecimal openaiUnitprice = bs[0];
BigDecimal realityUnitprice = bs[1];
userFlowPacketRemainLog.setOpenai_money((openaiUnitprice.multiply(new BigDecimal(usage.getTotalTokens()))).divide(new BigDecimal(1000),6,BigDecimal.ROUND_HALF_UP));
userFlowPacketRemainLog.setReality_money((realityUnitprice.multiply(new BigDecimal(usage.getTotalTokens()))).divide(new BigDecimal(1000),6,BigDecimal.ROUND_HALF_UP));
publicService.insertToTable(userFlowPacketRemainLog,"`lk_openai`.`user_flow_packet_remain_log`");
}
return AjaxResult.success();
}
}
... ...
... ... @@ -12,6 +12,7 @@ import com.ruoyi.common.core.domain.MessageCode;
import com.ruoyi.common.utils.DESUtil;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.login.service.LoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
... ... @@ -23,6 +24,10 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
... ... @@ -95,4 +100,5 @@ public class OpenAiUserLoginController extends BaseController {
String agenlongtoken = DESUtil.encode(ss[0]+"_"+ DateUtils.getNowTimeMilly(),ENCODE_KEY);
return AjaxResult.success().put(Constants.TOKEN, token).put("longtoken", agenlongtoken);
}
}
... ...
... ... @@ -58,6 +58,23 @@ public class UserInfoController extends BaseController {
return AjaxResult.success();
}
@ApiOperation("修改昵称和头像")
@PostMapping("/upUserInfo")
public AjaxResult upUserInfo(String nickname,String img_url)
{
StringBuffer stringBuffer = new StringBuffer();
if(StringUtils.isNotEmpty(nickname))
{
stringBuffer.append(",nickname='"+nickname+"'");
}
if(StringUtils.isNotEmpty(img_url))
{
stringBuffer.append(",img_url='"+img_url+"'");
}
String sql = "UPDATE `lk_openai`.`user_info` SET id="+getUserId().intValue()+stringBuffer+" WHERE id="+getUserId().intValue();
return AjaxResult.success(publicService.updateBySql(sql));
}
@ApiOperation("代币使用记录")
@GetMapping("/userFlowPacketRemainLog")
public TableDataInfo useFlowPacketRemainLog()
... ...
package com.zhonglai.luhui.openai.dto;
import java.util.List;
public class ChatGPTApiDto {
private List<ChatRoomMessages> messageList;
private Integer user_id;
private String room_id;
private Integer gptMessage_id;
private Boolean isfree;
public Boolean getIsfree() {
return isfree;
}
public void setIsfree(Boolean isfree) {
this.isfree = isfree;
}
public Integer getGptMessage_id() {
return gptMessage_id;
}
public void setGptMessage_id(Integer gptMessage_id) {
this.gptMessage_id = gptMessage_id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getRoom_id() {
return room_id;
}
public void setRoom_id(String room_id) {
this.room_id = room_id;
}
public List<ChatRoomMessages> getMessageList() {
return messageList;
}
public void setMessageList(List<ChatRoomMessages> messageList) {
this.messageList = messageList;
}
}
... ...
package com.zhonglai.luhui.openai.dto;
public class ChatgptMessageDto {
private String data;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
... ...
... ... @@ -13,6 +13,34 @@ public class CompletionResult3_5 {
private List<CompletionChoice3_5> choices;
private Usage usage;
private Integer user_id;
private String room_id;
private Integer gptMessage_id;
public Integer getGptMessage_id() {
return gptMessage_id;
}
public void setGptMessage_id(Integer gptMessage_id) {
this.gptMessage_id = gptMessage_id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getRoom_id() {
return room_id;
}
public void setRoom_id(String room_id) {
this.room_id = room_id;
}
public String getId() {
return id;
}
... ...
... ... @@ -22,6 +22,7 @@
<module>lh-openai</module>
<module>lh-log</module>
<module>lh-quartz</module>
<module>lh-chatgpt-api</module>
</modules>
<packaging>pom</packaging>
... ...