作者 钟来

模块整理

1 -<?xml version="1.0" encoding="UTF-8"?>  
2 -<project xmlns="http://maven.apache.org/POM/4.0.0"  
3 - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
4 - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
5 - <parent>  
6 - <artifactId>Luhui</artifactId>  
7 - <groupId>com.zhonglai.luhui</groupId>  
8 - <version>1.0-SNAPSHOT</version>  
9 - </parent>  
10 - <modelVersion>4.0.0</modelVersion>  
11 -  
12 - <artifactId>lh-domain</artifactId>  
13 -  
14 - <dependencies>  
15 - <dependency>  
16 - <groupId>org.apache.commons</groupId>  
17 - <artifactId>commons-lang3</artifactId>  
18 - </dependency>  
19 - <dependency>  
20 - <groupId>org.springframework.data</groupId>  
21 - <artifactId>spring-data-commons</artifactId>  
22 - </dependency>  
23 - <dependency>  
24 - <groupId>jakarta.validation</groupId>  
25 - <artifactId>jakarta.validation-api</artifactId>  
26 - </dependency>  
27 - <!-- Swagger3依赖 -->  
28 - <dependency>  
29 - <groupId>io.springfox</groupId>  
30 - <artifactId>springfox-boot-starter</artifactId>  
31 - <version>${swagger.version}</version>  
32 - <exclusions>  
33 - <exclusion>  
34 - <groupId>io.swagger</groupId>  
35 - <artifactId>swagger-models</artifactId>  
36 - </exclusion>  
37 - </exclusions>  
38 - </dependency>  
39 - </dependencies>  
40 -</project>  
1 -package com.ruoyi.system.domain.entity; import javax.validation.constraints.NotBlank;import javax.validation.constraints.Size;import org.apache.commons.lang3.builder.ToStringBuilder;import org.apache.commons.lang3.builder.ToStringStyle;import com.ruoyi.system.domain.tool.Excel;import com.ruoyi.system.domain.tool.Excel.ColumnType;import com.ruoyi.system.domain.tool.BaseEntity; /** * 字典类型表 sys_dict_type * * @author ruoyi */public class SysDictType extends BaseEntity{ private static final long serialVersionUID = 1L; /** 字典主键 */ @Excel(name = "字典主键", cellType = ColumnType.NUMERIC) private Long dictId; /** 字典名称 */ @Excel(name = "字典名称") private String dictName; /** 字典类型 */ @Excel(name = "字典类型") private String dictType; /** 状态(0正常 1停用) */ @Excel(name = "状态", readConverterExp = "0=正常,1=停用") private String status; public Long getDictId() { return dictId; } public void setDictId(Long dictId) { this.dictId = dictId; } @NotBlank(message = "字典名称不能为空") @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符") public String getDictName() { return dictName; } public void setDictName(String dictName) { this.dictName = dictName; } @NotBlank(message = "字典类型不能为空") @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符") public String getDictType() { return dictType; } public void setDictType(String dictType) { this.dictType = dictType; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } @Override public String toString() { return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) .append("dictId", getDictId()) .append("dictName", getDictName()) .append("dictType", getDictType()) .append("status", getStatus()) .append("createBy", getCreateBy()) .append("createTime", getCreateTime()) .append("updateBy", getUpdateBy()) .append("updateTime", getUpdateTime()) .append("remark", getRemark()) .toString(); }}  
1 -package com.zhonglai.luhui.openai;  
2 -  
3 -import com.ruoyi.framework.aspectj.LogAspect;  
4 -import com.ruoyi.framework.aspectj.RateLimiterAspect;  
5 -import com.ruoyi.framework.config.FilterConfig;  
6 -import com.ruoyi.framework.config.SecurityConfig;  
7 -import com.ruoyi.framework.security.filter.JwtAuthenticationTokenFilter;  
8 -import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;  
9 -import com.ruoyi.system.login.service.LoginService;  
10 -import com.ruoyi.system.login.service.TokenService;  
11 -import com.ruoyi.system.service.impl.SysConfigServiceImpl;  
12 -import com.ruoyi.system.service.impl.SysDictTypeServiceImpl;  
13 -import com.ruoyi.system.service.impl.SysUserServiceImpl;  
14 -import org.springframework.boot.SpringApplication;  
15 -import org.springframework.boot.autoconfigure.SpringBootApplication;  
16 -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;  
17 -import org.springframework.context.annotation.ComponentScan;  
18 -import org.springframework.context.annotation.FilterType;  
19 -  
20 -@ComponentScan(basePackages = {  
21 - "com.ruoyi.common",  
22 - "com.ruoyi.system",  
23 - "com.ruoyi.framework",  
24 - "com.zhonglai.luhui.openai.properties",  
25 - "com.zhonglai.luhui.openai.service",  
26 - "com.zhonglai.luhui.openai.controller"  
27 -}  
28 -)  
29 -@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })  
30 -public class OpenaiApplication {  
31 - public static void main(String[] args) {  
32 - SpringApplication.run(OpenaiApplication.class,args);  
33 - System.out.println("启动成功");  
34 - }  
35 -}  
1 -package com.zhonglai.luhui.openai.controller;  
2 -  
3 -import cn.hutool.http.HttpUtil;  
4 -import com.alibaba.fastjson.JSONObject;  
5 -import com.ruoyi.common.core.controller.BaseController;  
6 -import com.ruoyi.common.core.domain.AjaxResult;  
7 -import com.ruoyi.common.utils.DateUtils;  
8 -import com.ruoyi.common.utils.html.HttpUtils;  
9 -import com.ruoyi.system.login.dto.OpenAiLoginUser;  
10 -import com.ruoyi.system.login.dto.OpenAiUserInfo;  
11 -import com.ruoyi.system.service.PublicService;  
12 -import com.theokanning.openai.Usage;  
13 -import com.zhonglai.luhui.openai.dto.*;  
14 -import com.zhonglai.luhui.openai.service.VipServiceImpl;  
15 -import io.swagger.annotations.Api;  
16 -import io.swagger.annotations.ApiOperation;  
17 -import okhttp3.*;  
18 -import org.jetbrains.annotations.NotNull;  
19 -import org.springframework.beans.factory.annotation.Autowired;  
20 -import org.springframework.transaction.annotation.Transactional;  
21 -import org.springframework.web.bind.annotation.RequestBody;  
22 -import org.springframework.web.bind.annotation.RequestMapping;  
23 -import org.springframework.web.bind.annotation.RequestMethod;  
24 -import org.springframework.web.bind.annotation.RestController;  
25 -  
26 -import javax.servlet.http.HttpServletRequest;  
27 -import javax.servlet.http.HttpServletResponse;  
28 -import javax.servlet.http.HttpSession;  
29 -import java.io.*;  
30 -import java.math.BigDecimal;  
31 -import java.net.HttpURLConnection;  
32 -import java.net.URL;  
33 -import java.net.URLConnection;  
34 -import java.util.ArrayList;  
35 -import java.util.List;  
36 -import java.util.Optional;  
37 -  
38 -@Api(tags = "chatGPT流接口")  
39 -@RestController  
40 -@RequestMapping("/chatGPTStream")  
41 -public class ChatGPTStreamController extends BaseController {  
42 - private static String sessionkey = "CHAT_HISTORY_CONTEXT";//上下文关联存放地址  
43 - @Autowired  
44 - private PublicService publicService;  
45 -  
46 - @Autowired  
47 - private VipServiceImpl vipService;  
48 - @ApiOperation(value = "chatgpt3.5",notes = "上下文关联,要实现上下问关联就需要记录整个聊天的提问记录,目前只支持相同session的上下文关联,就是说,如果聊天页面关闭以后再打开,是没有上下文关联的")  
49 - @RequestMapping(value = "/chatgptV3_5",method = RequestMethod.POST)  
50 - public void chatgptV3_5(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, @RequestBody ChatgptMessageDto chatgptMessageDto) throws IOException {  
51 - //跟进用户信息生成入口参数  
52 - OpenAiLoginUser userInfo = (OpenAiLoginUser) getLoginUser();  
53 - Integer user_id= userInfo.getUserId().intValue();  
54 - String room_id = String.valueOf(user_id);  
55 -  
56 - OpenAiUserInfo openAiUserInfo = (OpenAiUserInfo) userInfo.getUser();  
57 -  
58 -  
59 - PrintWriter out = httpServletResponse.getWriter();  
60 - //验证余额是否充足  
61 - if(vipService.isCharging(openAiUserInfo.getVip_level()) && openAiUserInfo.getFlow_packet_remain()<=0)  
62 - {  
63 - StringBuffer stringBuffer = new StringBuffer();  
64 - stringBuffer.append("您的余额不足请联系管理员或者点击链接充值:\\n\\n");  
65 - stringBuffer.append("https://充值链接.com");  
66 - out.write(stringBuffer.toString());  
67 - return;  
68 - }  
69 -  
70 - BigDecimal[] bs = vipService.getUnitprice();  
71 - BigDecimal openaiUnitprice = bs[0];  
72 - BigDecimal realityUnitprice = bs[1];  
73 - if(openaiUnitprice.doubleValue()==0 || realityUnitprice.doubleValue()==0)  
74 - {  
75 - out.write("系统未配置流量单价,请联系管理员");  
76 - return;  
77 - }  
78 -  
79 - logger.info("{}生成聊天会话:",room_id);  
80 -  
81 - //上下文关联  
82 - HttpSession session = httpServletRequest.getSession();  
83 - List<ChatRoomMessages> messageList = Optional.ofNullable((List<ChatRoomMessages>) session.getAttribute(sessionkey)).orElse(new ArrayList<>());  
84 - ChatRoomMessages chatRoomMessages = new ChatRoomMessages();  
85 - chatRoomMessages.setRole("user");  
86 - chatRoomMessages.setContent(chatgptMessageDto.getData());  
87 - messageList.add(chatRoomMessages);  
88 - session.setAttribute(sessionkey,messageList);  
89 -  
90 - GptMessage gptMessage = new GptMessage();  
91 - gptMessage.setRoom_id(room_id);  
92 - gptMessage.setUser_id(user_id);  
93 - gptMessage.setSend_role(chatRoomMessages.getRole());  
94 - gptMessage.setSend_content(chatRoomMessages.getContent());  
95 - gptMessage.setCreate_time(DateUtils.getNowTimeMilly());  
96 - publicService.insertToTable(gptMessage,"`lk_openai`.`gpt_message`");  
97 -  
98 - //获取返回参数  
99 - ChatGPTApiDto chatGPTApiDto = new ChatGPTApiDto();  
100 - chatGPTApiDto.setGptMessage_id(gptMessage.getId());  
101 - chatGPTApiDto.setMessageList(messageList);  
102 - chatGPTApiDto.setUser_id(user_id);  
103 - chatGPTApiDto.setRoom_id(room_id);  
104 - chatGPTApiDto.setIsfree(vipService.isfree(openAiUserInfo.getVip_level()));  
105 -  
106 -  
107 - PrintWriter pout = null;  
108 - BufferedReader in = null;  
109 - try {  
110 - URL url = new URL("http://23.224.171.145:8086/chatGPTApi/sendMessage");  
111 - // 打开和URL之间的连接  
112 - URLConnection conn = url.openConnection();  
113 - // 设置通用的请求属性  
114 - conn.setRequestProperty("accept", "*/*");  
115 - conn.setRequestProperty("connection", "Keep-Alive");  
116 - conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");  
117 - // 发送POST请求必须设置如下两行  
118 - conn.setDoOutput(true);  
119 - conn.setDoInput(true);  
120 - // 获取URLConnection对象对应的输出流  
121 - pout = new PrintWriter(conn.getOutputStream());  
122 - // 发送请求参数  
123 - pout.print(JSONObject.toJSONString(chatGPTApiDto));  
124 - // flush输出流的缓冲  
125 - pout.flush();  
126 -  
127 - // 定义BufferedReader输入流来读取URL的响应  
128 - in = new BufferedReader(new InputStreamReader(conn.getInputStream()));  
129 - int character;  
130 - while ((character = in.read()) != -1) {  
131 - out.write((char) character);  
132 - out.flush();  
133 - }  
134 - } catch (Exception e) {  
135 - System.out.println("发送 POST 请求出现异常!" + e);  
136 - e.printStackTrace();  
137 - }  
138 - // 使用finally块来关闭输出流、输入流  
139 - finally {  
140 - try {  
141 - if (!(out == null)) {  
142 - out.close();  
143 - }  
144 - if (in != null) {  
145 - in.close();  
146 - }  
147 - } catch (IOException ex) {  
148 - ex.printStackTrace();  
149 - }  
150 - }  
151 -  
152 - }  
153 -  
154 - @ApiOperation(value = "更新消息状态")  
155 - @Transactional  
156 - @RequestMapping(value = "/upUserFlowPacketRemain",method = RequestMethod.POST)  
157 - public AjaxResult upUserFlowPacketRemain(@RequestBody CompletionResult3_5 completionResult3_5 )  
158 - {  
159 - Usage usage = completionResult3_5.getUsage();  
160 - List<CompletionChoice3_5> list3_5 = completionResult3_5.getChoices();  
161 -  
162 - if(null != list3_5 && list3_5.size() !=0 )  
163 - {  
164 - GptMessage gptMessage = new GptMessage();  
165 - gptMessage.setPrompt_tokens(0l);  
166 - gptMessage.setCompletion_tokens(0l);  
167 - gptMessage.setTotal_tokens(0l);  
168 - gptMessage.setMessage_size(0);  
169 - gptMessage.setSend_size(completionResult3_5.getContentLength());  
170 - for (CompletionChoice3_5 completionChoice:list3_5)  
171 - {  
172 - //统计代币  
173 - gptMessage.setCompletion_tokens(gptMessage.getCompletion_tokens()+usage.getCompletionTokens());  
174 - gptMessage.setPrompt_tokens(gptMessage.getPrompt_tokens()+usage.getPromptTokens());  
175 - gptMessage.setTotal_tokens(gptMessage.getTotal_tokens()+usage.getTotalTokens());  
176 -  
177 - if(null != completionChoice.getMessage())  
178 - {  
179 - gptMessage.setMessage_role(completionChoice.getMessage().getRole());  
180 - }  
181 -  
182 - if(null != gptMessage.getMessage_content())  
183 - {  
184 - gptMessage.setMessage_size(gptMessage.getMessage_size()+gptMessage.getMessage_content().length());  
185 - }  
186 -  
187 - }  
188 - gptMessage.setId(completionResult3_5.getGptMessage_id());  
189 - publicService.updateObjectByTable(gptMessage,"id","`lk_openai`.`gpt_message`");  
190 -  
191 - publicService.updateBySql("UPDATE `lk_openai`.`user_info` SET flow_packet_remain=flow_packet_remain-"+usage.getTotalTokens()+" WHERE id="+completionResult3_5.getUser_id());  
192 -  
193 - UserFlowPacketRemainLog userFlowPacketRemainLog = new UserFlowPacketRemainLog();  
194 - userFlowPacketRemainLog.setCreate_time(DateUtils.getNowTimeMilly());  
195 - userFlowPacketRemainLog.setUser_id(completionResult3_5.getUser_id());  
196 - userFlowPacketRemainLog.setType(2); //消费  
197 -  
198 - StringBuffer stringBuffer = new StringBuffer();  
199 - stringBuffer.append("房间号:");  
200 - stringBuffer.append(completionResult3_5.getRoom_id());  
201 - stringBuffer.append(";");  
202 - stringBuffer.append("发送代币:");  
203 - stringBuffer.append(usage.getPromptTokens());  
204 - stringBuffer.append(";");  
205 - stringBuffer.append("返回代币:");  
206 - stringBuffer.append(usage.getCompletionTokens());  
207 - stringBuffer.append(";");  
208 -  
209 - userFlowPacketRemainLog.setDescribe(stringBuffer.toString());  
210 - userFlowPacketRemainLog.setTotal_tokens(usage.getTotalTokens());  
211 -  
212 - BigDecimal[] bs = vipService.getUnitprice();  
213 - BigDecimal openaiUnitprice = bs[0];  
214 - BigDecimal realityUnitprice = bs[1];  
215 - userFlowPacketRemainLog.setOpenai_money((openaiUnitprice.multiply(new BigDecimal(usage.getTotalTokens()))).divide(new BigDecimal(1000),6,BigDecimal.ROUND_HALF_UP));  
216 - userFlowPacketRemainLog.setReality_money((realityUnitprice.multiply(new BigDecimal(usage.getTotalTokens()))).divide(new BigDecimal(1000),6,BigDecimal.ROUND_HALF_UP));  
217 - publicService.insertToTable(userFlowPacketRemainLog,"`lk_openai`.`user_flow_packet_remain_log`");  
218 - }  
219 - return AjaxResult.success();  
220 - }  
221 -}  
1 -package com.zhonglai.luhui.openai.controller;  
2 -  
3 -import cn.hutool.core.bean.BeanUtil;  
4 -import cn.hutool.http.HttpUtil;  
5 -import com.alibaba.fastjson.JSON;  
6 -import com.ruoyi.common.constant.Constants;  
7 -import com.ruoyi.common.constant.HttpStatus;  
8 -import com.ruoyi.common.core.controller.BaseController;  
9 -import com.ruoyi.common.core.domain.AjaxResult;  
10 -import com.ruoyi.common.core.domain.Message;  
11 -import com.ruoyi.common.core.domain.MessageCode;  
12 -import com.ruoyi.common.utils.DESUtil;  
13 -import com.ruoyi.common.utils.DateUtils;  
14 -import com.ruoyi.common.utils.GsonConstructor;  
15 -import com.ruoyi.common.utils.StringUtils;  
16 -import com.ruoyi.system.login.service.LoginService;  
17 -import io.swagger.annotations.Api;  
18 -import io.swagger.annotations.ApiImplicitParam;  
19 -import io.swagger.annotations.ApiImplicitParams;  
20 -import io.swagger.annotations.ApiOperation;  
21 -import org.springframework.beans.factory.annotation.Autowired;  
22 -import org.springframework.web.bind.annotation.GetMapping;  
23 -import org.springframework.web.bind.annotation.PostMapping;  
24 -import org.springframework.web.bind.annotation.RequestMapping;  
25 -import org.springframework.web.bind.annotation.RestController;  
26 -  
27 -import javax.servlet.http.HttpServletRequest;  
28 -import javax.servlet.http.HttpServletResponse;  
29 -import java.io.IOException;  
30 -import java.io.PrintWriter;  
31 -import java.util.HashMap;  
32 -import java.util.Map;  
33 -  
34 -@Api(tags = "登陆")  
35 -@RestController  
36 -@RequestMapping("/openAiUserLogin")  
37 -public class OpenAiUserLoginController extends BaseController {  
38 - private static String user_pass = "123456";  
39 -  
40 - public static String ENCODE_KEY = "com/zhonglai";  
41 - @Autowired  
42 - private LoginService loginService;  
43 - @ApiOperation(value = "手机验证码登陆",notes = "返回token和longtoken,token是接口操作令牌失效时间端,长期本地缓存推荐存储longtoken,longtoken可以通过/openAiUserLogin/getTokenFromLongtoken接口换取token")  
44 - @ApiImplicitParams({  
45 - @ApiImplicitParam(value = "/openAiUserLogin/sendPhoneCode返回的data数据",name = "key"),  
46 - @ApiImplicitParam(value = "验证码",name = "code"),  
47 - })  
48 - @PostMapping("/userpassLogin")  
49 - public AjaxResult userpassLogin(String code, String key,String promo_code)  
50 - {  
51 - //验证验证码  
52 - String str = HttpUtil.post("http://ly.userlogin.yu2le.com/userLogin/verificationCode?key="+key+"&code="+code,new HashMap<>());  
53 -  
54 - Message message = GsonConstructor.get().fromJson(str,Message.class);  
55 - if(message.getCode()!=MessageCode.DEFAULT_SUCCESS_CODE.code)  
56 - {  
57 - return AjaxResult.error(message.getMessage());  
58 - }  
59 - String[] keys = DESUtil.decode(message.getData().toString(), ENCODE_KEY).split("_");  
60 -  
61 - //生成令牌  
62 - String token = loginService.openaiLoginByPass(keys[0],user_pass);  
63 - String longtoken = DESUtil.encode(keys[0]+"_"+ DateUtils.getNowTimeMilly(),ENCODE_KEY);  
64 - return AjaxResult.success().put(Constants.TOKEN, token).put("longtoken", longtoken);  
65 - }  
66 -  
67 -  
68 - @ApiOperation("发送验证码")  
69 - @ApiImplicitParams({  
70 - @ApiImplicitParam(value = "手机号",name = "phone"),  
71 - })  
72 - @PostMapping("/sendPhoneCode")  
73 - public AjaxResult sendPhoneCode(String phone)  
74 - {  
75 - //生成令牌  
76 - String str = HttpUtil.get("http://ly.userlogin.yu2le.com/userLogin/getPhoneCode/1/"+phone);  
77 - Message message = GsonConstructor.get().fromJson(str,Message.class);  
78 - if(message.getCode()!=MessageCode.DEFAULT_SUCCESS_CODE.code)  
79 - {  
80 - return AjaxResult.error(message.getMessage());  
81 - }  
82 - return AjaxResult.success(message.getMessage()).put("data",message.getData());  
83 - }  
84 -  
85 - @ApiOperation(value = "长期token获取短期token",notes = "此接口也会返回一个长token,推荐用此接口更新本地存储的长token,可以延长长token的使用时间" +  
86 - "测试:071FF4B44E9B36FB9814F21FF717CE76F272978A3C49F065")  
87 - @ApiImplicitParams({  
88 - @ApiImplicitParam(value = "长token(为接口 /openAiUserLogin/userpassLogin 返回的 longtoken)",name = "longtoken"),  
89 - })  
90 - @GetMapping("/getTokenFromLongtoken")  
91 - public AjaxResult getTokenFromLongtoken(String longtoken)  
92 - {  
93 - String str = DESUtil.decode(longtoken,ENCODE_KEY);  
94 - String[] ss = str.split("_");  
95 - Integer time = 5184000; //60天  
96 - if(DateUtils.getNowTimeMilly()-Integer.parseInt(ss[1])>time)  
97 - {  
98 - return AjaxResult.error(HttpStatus.FORBIDDEN,"长token过期,请重新用手机号登陆");  
99 - }  
100 - String token = loginService.openaiLoginByPass(ss[0],user_pass);  
101 - String agenlongtoken = DESUtil.encode(ss[0]+"_"+ DateUtils.getNowTimeMilly(),ENCODE_KEY);  
102 - return AjaxResult.success().put(Constants.TOKEN, token).put("longtoken", agenlongtoken);  
103 - }  
104 -  
105 -}  
1 -package com.zhonglai.luhui.openai.properties;  
2 -  
3 -import com.zhonglai.luhui.openai.utils.OpenAiUtils;  
4 -import org.springframework.beans.factory.InitializingBean;  
5 -import org.springframework.beans.factory.annotation.Value;  
6 -import org.springframework.stereotype.Component;  
7 -  
8 -@Component  
9 -public class OpenAiProperties implements InitializingBean {  
10 -  
11 - @Value("${chatgpt.token}")  
12 - private String token; //秘钥  
13 - @Value("${chatgpt.timeout}")  
14 - private Integer timeout; //超时时间  
15 -  
16 - // 设置属性时同时设置给OpenAiUtils  
17 - @Override  
18 - public void afterPropertiesSet() {  
19 - OpenAiUtils.OPENAPI_TOKEN = token;  
20 - OpenAiUtils.TIMEOUT = timeout;  
21 - }  
22 -}  
1 -package com.zhonglai.luhui.openai.utils;  
2 -  
3 -import com.theokanning.openai.OpenAiService;  
4 -import com.theokanning.openai.completion.CompletionChoice;  
5 -import com.theokanning.openai.completion.CompletionRequest;  
6 -import com.zhonglai.luhui.openai.pojos.OpenAi;  
7 -import org.springframework.util.StringUtils;  
8 -  
9 -import java.util.*;  
10 -  
11 -/**  
12 - * 调用OpenAi的49中方法  
13 - */  
14 -public class OpenAiUtils {  
15 - public static final Map<String, OpenAi> PARMS = new HashMap<>();  
16 -  
17 - static {  
18 - PARMS.put("OpenAi01", new OpenAi("OpenAi01", "问&答", "依据现有知识库问&答", "text-davinci-003", "Q: %s\nA:", 0.0, 1.0, 1.0, 0.0, 0.0, "\n"));  
19 - PARMS.put("OpenAi02", new OpenAi("OpenAi02", "语法纠正", "将句子转换成标准的英语,输出结果始终是英文", "text-davinci-003", "%s", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
20 - PARMS.put("OpenAi03", new OpenAi("OpenAi03", "内容概况", "将一段话,概况中心", "text-davinci-003", "Summarize this for a second-grade student:\n%s", 0.7, 1.0, 1.0, 0.0, 0.0, ""));  
21 - PARMS.put("OpenAi04", new OpenAi("OpenAi04", "生成OpenAi的代码", "一句话生成OpenAi的代码", "code-davinci-002", "\"\"\"\nUtil exposes the following:\nutil.openai() -> authenticates & returns the openai module, which has the following functions:\nopenai.Completion.create(\n prompt=\"<my prompt>\", # The prompt to start completing from\n max_tokens=123, # The max number of tokens to generate\n temperature=1.0 # A measure of randomness\n echo=True, # Whether to return the prompt in addition to the generated completion\n)\n\"\"\"\nimport util\n\"\"\"\n%s\n\"\"\"\n\n", 0.0, 1.0, 1.0, 0.0, 0.0, "\"\"\""));  
22 - PARMS.put("OpenAi05", new OpenAi("OpenAi05", "程序命令生成", "一句话生成程序的命令,目前支持操作系统指令比较多", "text-davinci-003", "Convert this text to a programmatic command:\n\nExample: Ask Constance if we need some bread\nOutput: send-msg `find constance` Do we need some bread?\n\n%s", 0.0, 1.0, 1.0, 0.2, 0.0, ""));  
23 - PARMS.put("OpenAi06", new OpenAi("OpenAi06", "语言翻译", "把一种语法翻译成其它几种语言", "text-davinci-003", "Translate this into %s:\n%s", 0.3, 1.0, 1.0, 0.0, 0.0, ""));  
24 - PARMS.put("OpenAi07", new OpenAi("OpenAi07", "Stripe国际API生成", "一句话生成Stripe国际支付API", "code-davinci-002", "\"\"\"\nUtil exposes the following:\n\nutil.stripe() -> authenticates & returns the stripe module; usable as stripe.Charge.create etc\n\"\"\"\nimport util\n\"\"\"\n%s\n\"\"\"", 0.0, 1.0, 1.0, 0.0, 0.0, "\"\"\""));  
25 - PARMS.put("OpenAi08", new OpenAi("OpenAi08", "SQL语句生成", "依据上下文中的表信息,生成SQL语句", "code-davinci-002", "### %s SQL tables, 表字段信息如下:\n%s\n#\n### %s\n %s", 0.0, 1.0, 1.0, 0.0, 0.0, "# ;"));  
26 - PARMS.put("OpenAi09", new OpenAi("OpenAi09", "结构化生成", "对于非结构化的数据抽取其中的特征生成结构化的表格", "text-davinci-003", "A table summarizing, use Chinese:\n%s\n", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
27 - PARMS.put("OpenAi10", new OpenAi("OpenAi10", "信息分类", "把一段信息继续分类", "text-davinci-003", "%s\n分类:", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
28 - PARMS.put("OpenAi11", new OpenAi("OpenAi11", "Python代码解释", "把代码翻译成文字,用来解释程序的作用", "code-davinci-002", "# %s \n %s \n\n# 解释代码作用\n\n#", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
29 - PARMS.put("OpenAi12", new OpenAi("OpenAi12", "文字转表情符号", "将文本编码成表情服务", "text-davinci-003", "转换文字为表情。\n%s:", 0.8, 1.0, 1.0, 0.0, 0.0, "\n"));  
30 - PARMS.put("OpenAi13", new OpenAi("OpenAi13", "时间复杂度计算", "求一段代码的时间复杂度", "text-davinci-003", "%s\n\"\"\"\n函数的时间复杂度是", 0.0, 1.0, 1.0, 0.0, 0.0, "\n"));  
31 - PARMS.put("OpenAi14", new OpenAi("OpenAi14", "程序代码翻译", "把一种语言的代码翻译成另外一种语言的代码", "code-davinci-002", "##### 把这段代码从%s翻译成%s\n### %s\n \n %s\n \n### %s", 0.0, 1.0, 1.0, 0.0, 0.0, "###"));  
32 - PARMS.put("OpenAi15", new OpenAi("OpenAi15", "高级情绪评分", "支持批量列表的方式检查情绪", "text-davinci-003", "对下面内容进行情感分类:\n%s\"\n情绪评级:", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
33 - PARMS.put("OpenAi16", new OpenAi("OpenAi16", "代码解释", "对一段代码进行解释", "code-davinci-002", "代码:\n%s\n\"\"\"\n上面的代码在做什么:\n1. ", 0.0, 1.0, 1.0, 0.0, 0.0, "\"\"\""));  
34 - PARMS.put("OpenAi17", new OpenAi("OpenAi17", "关键字提取", "提取一段文本中的关键字", "text-davinci-003", "抽取下面内容的关键字:\n%s", 0.5, 1.0, 1.0, 0.8, 0.0, ""));  
35 - PARMS.put("OpenAi18", new OpenAi("OpenAi18", "问题解答", "类似解答题", "text-davinci-003", "Q: %s\nA: ?", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
36 - PARMS.put("OpenAi19", new OpenAi("OpenAi19", "广告设计", "给一个产品设计一个广告", "text-davinci-003", "为下面的产品创作一个创业广告,用于投放到抖音上:\n产品:%s.", 0.5, 1.0, 1.0, 0.0, 0.0, ""));  
37 - PARMS.put("OpenAi20", new OpenAi("OpenAi20", "产品取名", "依据产品描述和种子词语,给一个产品取一个好听的名字", "text-davinci-003", "产品描述: %s.\n种子词: %s.\n产品名称: ", 0.8, 1.0, 1.0, 0.0, 0.0, ""));  
38 - PARMS.put("OpenAi21", new OpenAi("OpenAi21", "句子简化", "把一个长句子简化成一个短句子", "text-davinci-003", "%s\nTl;dr: ", 0.7, 1.0, 1.0, 0.0, 1.0, ""));  
39 - PARMS.put("OpenAi22", new OpenAi("OpenAi22", "修复代码Bug", "自动修改代码中的bug", "code-davinci-002", "##### 修复下面代码的bug\n### %s\n %s\n### %s\n", 0.0, 1.0, 1.0, 0.0, 0.0, "###"));  
40 - PARMS.put("OpenAi23", new OpenAi("OpenAi23", "表格填充数据", "自动为一个表格生成数据", "text-davinci-003", "spreadsheet ,%s rows:\n%s\n", 0.5, 1.0, 1.0, 0.0, 0.0, ""));  
41 - PARMS.put("OpenAi24", new OpenAi("OpenAi24", "语言聊天机器人", "各种开发语言的两天机器人", "code-davinci-002", "You: %s\n%s机器人:", 0.0, 1.0, 1.0, 0.5, 0.0, "You: "));  
42 - PARMS.put("OpenAi25", new OpenAi("OpenAi25", "机器学习机器人", "机器学习模型方面的机器人", "text-davinci-003", "You: %s\nML机器人:", 0.3, 1.0, 1.0, 0.5, 0.0, "You: "));  
43 - PARMS.put("OpenAi26", new OpenAi("OpenAi26", "清单制作", "可以列出各方面的分类列表,比如歌单", "text-davinci-003", "列出10%s:", 0.5, 1.0, 1.0, 0.52, 0.5, "11.0"));  
44 - PARMS.put("OpenAi27", new OpenAi("OpenAi27", "文本情绪分析", "对一段文字进行情绪分析", "text-davinci-003", "推断下面文本的情绪是积极的, 中立的, 还是消极的.\n文本: \"%s\"\n观点:", 0.0, 1.0, 1.0, 0.5, 0.0, ""));  
45 - PARMS.put("OpenAi28", new OpenAi("OpenAi28", "航空代码抽取", "抽取文本中的航空diam信息", "text-davinci-003", "抽取下面文本中的航空代码:\n文本:\"%s\"\n航空代码:", 0.0, 1.0, 1.0, 0.0, 0.0, "\n"));  
46 - PARMS.put("OpenAi29", new OpenAi("OpenAi29", "生成SQL语句", "无上下文,语句描述生成SQL", "text-davinci-003", "%s", 0.3, 1.0, 1.0, 0.0, 0.0, ""));  
47 - PARMS.put("OpenAi30", new OpenAi("OpenAi30", "抽取联系信息", "从文本中抽取联系方式", "text-davinci-003", "从下面文本中抽取%s:\n%s", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
48 - PARMS.put("OpenAi31", new OpenAi("OpenAi31", "程序语言转换", "把一种语言转成另外一种语言", "code-davinci-002", "#%s to %s:\n%s:%s\n\n%s:", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
49 - PARMS.put("OpenAi32", new OpenAi("OpenAi32", "好友聊天", "模仿好友聊天", "text-davinci-003", "You: %s\n好友:", 0.5, 1.0, 1.0, 0.5, 0.0, "You:"));  
50 - PARMS.put("OpenAi33", new OpenAi("OpenAi33", "颜色生成", "依据描述生成对应颜色", "text-davinci-003", "%s:\nbackground-color: ", 0.0, 1.0, 1.0, 0.0, 0.0, ";"));  
51 - PARMS.put("OpenAi34", new OpenAi("OpenAi34", "程序文档生成", "自动为程序生成文档", "code-davinci-002", "# %s\n \n%s\n# 上述代码的详细、高质量文档字符串:\n\"\"\"", 0.0, 1.0, 1.0, 0.0, 0.0, "#\"\"\""));  
52 - PARMS.put("OpenAi35", new OpenAi("OpenAi35", "段落创作", "依据短语生成相关文短", "text-davinci-003", "为下面短语创建一个中文段:\n%s:\n", 0.5, 1.0, 1.0, 0.0, 0.0, ""));  
53 - PARMS.put("OpenAi36", new OpenAi("OpenAi36", "代码压缩", "把多行代码简单的压缩成一行", "code-davinci-002", "将下面%s代码转成一行:\n%s\n%s一行版本:", 0.0, 1.0, 1.0, 0.0, 0.0, ";"));  
54 - PARMS.put("OpenAi37", new OpenAi("OpenAi37", "故事创作", "依据一个主题创建一个故事", "text-davinci-003", "主题: %s\n故事创作:", 0.8, 1.0, 1.0, 0.5, 0.0, ""));  
55 - PARMS.put("OpenAi38", new OpenAi("OpenAi38", "人称转换", "第一人称转第3人称", "text-davinci-003", "把下面内容从第一人称转为第三人称 (性别女):\n%s\n", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
56 - PARMS.put("OpenAi39", new OpenAi("OpenAi39", "摘要说明", "依据笔记生成摘要说明", "text-davinci-003", "将下面内容转换成将下%s摘要:\n%s", 0.0, 1.0, 1.0, 0.0, 0.0, ""));  
57 - PARMS.put("OpenAi40", new OpenAi("OpenAi40", "头脑风暴", "给定一个主题,让其生成一些主题相关的想法", "text-davinci-003", "头脑风暴一些关于%s的想法:", 0.6, 1.0, 1.0, 1.0, 1.0, ""));  
58 - PARMS.put("OpenAi41", new OpenAi("OpenAi41", "ESRB文本分类", "按照ESRB进行文本分类", "text-davinci-003", "Provide an ESRB rating for the following text:\\n\\n\\\"%s\"\\n\\nESRB rating:", 0.3, 1.0, 1.0, 0.0, 0.0, "\n"));  
59 - PARMS.put("OpenAi42", new OpenAi("OpenAi42", "提纲生成", "按照提示为相关内容生成提纲", "text-davinci-003", "为%s提纲:", 0.3, 1.0, 1.0, 0.0, 0.0, ""));  
60 - PARMS.put("OpenAi43", new OpenAi("OpenAi43", "美食制作(后果自负)", "依据美食名称和材料生成美食的制作步骤", "text-davinci-003", "依据下面成分和美食,生成制作方法:\n%s\n成分:\n%s\n制作方法:", 0.3, 1.0, 1.0, 0.0, 0.0, ""));  
61 - PARMS.put("OpenAi44", new OpenAi("OpenAi44", "AI聊天", "与AI机器进行聊天", "text-davinci-003", "Human: %s", 0.9, 1.0, 1.0, 0.0, 0.6, "Human:AI:"));  
62 - PARMS.put("OpenAi45", new OpenAi("OpenAi45", "摆烂聊天", "与讽刺机器进行聊天", "text-davinci-003", "Marv不情愿的回答问题.\nYou:%s\nMarv:", 0.5, 0.3, 1.0, 0.5, 0.0, ""));  
63 - PARMS.put("OpenAi46", new OpenAi("OpenAi46", "分解步骤", "把一段文本分解成几步来完成", "text-davinci-003", "为下面文本生成次序列表,并增加列表数子: \n%s\n", 0.3, 1.0, 1.0, 0.0, 0.0, ""));  
64 - PARMS.put("OpenAi47", new OpenAi("OpenAi47", "点评生成", "依据文本内容自动生成点评", "text-davinci-003", "依据下面内容,进行点评:\n%s\n点评:", 0.5, 1.0, 1.0, 0.0, 0.0, ""));  
65 - PARMS.put("OpenAi48", new OpenAi("OpenAi48", "知识学习", "可以为学习知识自动解答", "text-davinci-003", "%s", 0.3, 1.0, 1.0, 0.0, 0.0, ""));  
66 - PARMS.put("OpenAi49", new OpenAi("OpenAi49", "面试", "生成面试题", "text-davinci-003", "创建10道%s相关的面试题(中文):\n", 0.5, 1.0, 10.0, 0.0, 0.0, ""));  
67 - PARMS.put("OpenAi50", new OpenAi("OpenAi50", "chatgpt3.5", "chatgpt3.5", "gpt-3.5-turbo-0301", "%s", null, null, null, null, null, null));  
68 -  
69 - }  
70 -  
71 - public static String OPENAPI_TOKEN = "";  
72 - public static Integer TIMEOUT = null;  
73 -  
74 - /**  
75 - * 获取ai  
76 - *  
77 - * @param openAi  
78 - * @param prompt  
79 - * @return  
80 - */  
81 - public static List<CompletionChoice> getAiResult(OpenAi openAi, String prompt) {  
82 - if (TIMEOUT == null || TIMEOUT < 1000) {  
83 - TIMEOUT = 3000;  
84 - }  
85 -  
86 - OpenAiService service = new OpenAiService(OPENAPI_TOKEN, TIMEOUT);  
87 - CompletionRequest.CompletionRequestBuilder builder = CompletionRequest.builder()  
88 - .model(openAi.getModel())  
89 - .prompt(prompt)  
90 - .temperature(openAi.getTemperature())  
91 - .maxTokens(1000)  
92 - .topP(openAi.getTopP())  
93 - .frequencyPenalty(openAi.getFrequencyPenalty())  
94 - .presencePenalty(openAi.getPresencePenalty());  
95 - if(!StringUtils.isEmpty(openAi.getUser()))  
96 - {  
97 - builder.user(openAi.getUser());  
98 - }  
99 - if (!StringUtils.isEmpty(openAi.getStop())) {  
100 - builder.stop(Arrays.asList(openAi.getStop().split(",")));  
101 - }  
102 - CompletionRequest completionRequest = builder.build();  
103 - return service.createCompletion(completionRequest).getChoices();  
104 - }  
105 -  
106 - /**  
107 - * 问答  
108 - *  
109 - * @param question  
110 - * @return  
111 - */  
112 - public static List<CompletionChoice> getQuestionAnswer(String question) {  
113 - OpenAi openAi = PARMS.get("OpenAi01");  
114 - return getAiResult(openAi, String.format(openAi.getPrompt(), question));  
115 - }  
116 -  
117 - /**  
118 - * 语法纠错  
119 - *  
120 - * @param text  
121 - * @return  
122 - */  
123 - public static List<CompletionChoice> getGrammarCorrection(String text) {  
124 - OpenAi openAi = PARMS.get("OpenAi02");  
125 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
126 - }  
127 -  
128 - /**  
129 - * 将一段话,概况中心  
130 - *  
131 - * @param text  
132 - * @return  
133 - */  
134 - public static List<CompletionChoice> getSummarize(String text) {  
135 - OpenAi openAi = PARMS.get("OpenAi03");  
136 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
137 - }  
138 -  
139 - /**  
140 - * 一句话生成OpenAi的代码  
141 - *  
142 - * @param text  
143 - * @return  
144 - */  
145 - public static List<CompletionChoice> getOpenAiApi(String text) {  
146 - OpenAi openAi = PARMS.get("OpenAi04");  
147 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
148 - }  
149 -  
150 - /**  
151 - * 一句话生成程序的命令,目前支持操作系统指令比较多  
152 - *  
153 - * @param text  
154 - * @return  
155 - */  
156 - public static List<CompletionChoice> getTextToCommand(String text) {  
157 - OpenAi openAi = PARMS.get("OpenAi05");  
158 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
159 - }  
160 -  
161 - /**  
162 - * 把一种语法翻译成其它几种语言  
163 - *  
164 - * @param text  
165 - * @return  
166 - */  
167 - public static List<CompletionChoice> getTranslatesLanguages(String text, String translatesLanguages) {  
168 - if (StringUtils.isEmpty(translatesLanguages)) {  
169 - translatesLanguages = " 1. French, 2. Spanish and 3. English";  
170 - }  
171 - OpenAi openAi = PARMS.get("OpenAi06");  
172 - return getAiResult(openAi, String.format(openAi.getPrompt(), translatesLanguages, text));  
173 - }  
174 -  
175 - /**  
176 - * 一句话生成Stripe国际支付API  
177 - *  
178 - * @param text  
179 - * @return  
180 - */  
181 - public static List<CompletionChoice> getStripeApi(String text) {  
182 - OpenAi openAi = PARMS.get("OpenAi07");  
183 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
184 - }  
185 -  
186 -  
187 - /**  
188 - * 依据上下文中的表信息,生成SQL语句  
189 - *  
190 - * @param databaseType 数据库类型  
191 - * @param tables 上午依赖的表和字段 Employee(id, name, department_id)  
192 - * @param text SQL描述  
193 - * @param sqlType sql类型,比如SELECT  
194 - * @return  
195 - */  
196 - public static List<CompletionChoice> getStripeApi(String databaseType, List<String> tables, String text, String sqlType) {  
197 - OpenAi openAi = PARMS.get("OpenAi08");  
198 - StringJoiner joiner = new StringJoiner("\n");  
199 - for (int i = 0; i < tables.size(); i++) {  
200 - joiner.add("# " + tables);  
201 - }  
202 - return getAiResult(openAi, String.format(openAi.getPrompt(), databaseType, joiner.toString(), text, sqlType));  
203 - }  
204 -  
205 - /**  
206 - * 对于非结构化的数据抽取其中的特征生成结构化的表格  
207 - *  
208 - * @param text 非结构化的数据  
209 - * @return  
210 - */  
211 - public static List<CompletionChoice> getUnstructuredData(String text) {  
212 - OpenAi openAi = PARMS.get("OpenAi09");  
213 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
214 - }  
215 -  
216 - /**  
217 - * 把一段信息继续分类  
218 - *  
219 - * @param text 要分类的文本  
220 - * @return  
221 - */  
222 - public static List<CompletionChoice> getTextCategory(String text) {  
223 - OpenAi openAi = PARMS.get("OpenAi10");  
224 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
225 - }  
226 -  
227 - /**  
228 - * 把一段信息继续分类  
229 - *  
230 - * @param codeType 代码类型,比如Python  
231 - * @param code 要解释的代码  
232 - * @return  
233 - */  
234 - public static List<CompletionChoice> getCodeExplain(String codeType, String code) {  
235 - OpenAi openAi = PARMS.get("OpenAi11");  
236 - return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code));  
237 - }  
238 -  
239 - /**  
240 - * 将文本编码成表情服务  
241 - *  
242 - * @param text 文本  
243 - * @return  
244 - */  
245 - public static List<CompletionChoice> getTextEmoji(String text) {  
246 - OpenAi openAi = PARMS.get("OpenAi12");  
247 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
248 - }  
249 -  
250 - /**  
251 - * 求一段代码的时间复杂度  
252 - *  
253 - * @param code 代码  
254 - * @return  
255 - */  
256 - public static List<CompletionChoice> getTimeComplexity(String code) {  
257 - OpenAi openAi = PARMS.get("OpenAi13");  
258 - return getAiResult(openAi, String.format(openAi.getPrompt(), code));  
259 - }  
260 -  
261 -  
262 - /**  
263 - * 把一种语言的代码翻译成另外一种语言的代码  
264 - *  
265 - * @param fromLanguage 要翻译的代码语言  
266 - * @param toLanguage 要翻译成的代码语言  
267 - * @param code 代码  
268 - * @return  
269 - */  
270 - public static List<CompletionChoice> getTranslateProgramming(String fromLanguage, String toLanguage, String code) {  
271 - OpenAi openAi = PARMS.get("OpenAi14");  
272 - return getAiResult(openAi, String.format(openAi.getPrompt(), fromLanguage, toLanguage, fromLanguage, code, toLanguage));  
273 - }  
274 -  
275 - /**  
276 - * 支持批量列表的方式检查情绪  
277 - *  
278 - * @param texts 文本  
279 - * @return  
280 - */  
281 - public static List<CompletionChoice> getBatchTweetClassifier(List<String> texts) {  
282 - OpenAi openAi = PARMS.get("OpenAi15");  
283 - StringJoiner stringJoiner = new StringJoiner("\n");  
284 - for (int i = 0; i < texts.size(); i++) {  
285 - stringJoiner.add((i + 1) + ". " + texts.get(i));  
286 - }  
287 - return getAiResult(openAi, String.format(openAi.getPrompt(), stringJoiner.toString()));  
288 - }  
289 -  
290 - /**  
291 - * 对一段代码进行解释  
292 - *  
293 - * @param code 文本  
294 - * @return  
295 - */  
296 - public static List<CompletionChoice> getExplainCOde(String code) {  
297 - OpenAi openAi = PARMS.get("OpenAi16");  
298 - return getAiResult(openAi, String.format(openAi.getPrompt(), code));  
299 - }  
300 -  
301 - /**  
302 - * 提取一段文本中的关键字  
303 - *  
304 - * @param text 文本  
305 - * @return  
306 - */  
307 - public static List<CompletionChoice> getTextKeywords(String text) {  
308 - OpenAi openAi = PARMS.get("OpenAi17");  
309 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
310 - }  
311 -  
312 - /**  
313 - * 事实回答答题  
314 - *  
315 - * @param text 文本  
316 - * @return  
317 - */  
318 - public static List<CompletionChoice> getFactualAnswering(String text) {  
319 - OpenAi openAi = PARMS.get("OpenAi18");  
320 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
321 - }  
322 -  
323 - /**  
324 - * 给一个产品设计一个广告  
325 - *  
326 - * @param text 文本  
327 - * @return  
328 - */  
329 - public static List<CompletionChoice> getAd(String text) {  
330 - OpenAi openAi = PARMS.get("OpenAi19");  
331 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
332 - }  
333 -  
334 - /**  
335 - * 依据产品描述和种子词语,给一个产品取一个好听的名字  
336 - *  
337 - * @param productDescription 产品描述  
338 - * @param seedWords 种子词语  
339 - * @return  
340 - */  
341 - public static List<CompletionChoice> getProductName(String productDescription, String seedWords) {  
342 - OpenAi openAi = PARMS.get("OpenAi20");  
343 - return getAiResult(openAi, String.format(openAi.getPrompt(), productDescription, seedWords));  
344 - }  
345 -  
346 - /**  
347 - * 把一个长句子简化成一个短句子  
348 - *  
349 - * @param text 长句子  
350 - * @return  
351 - */  
352 - public static List<CompletionChoice> getProductName(String text) {  
353 - OpenAi openAi = PARMS.get("OpenAi21");  
354 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
355 - }  
356 -  
357 - /**  
358 - * 自动修改代码中的bug  
359 - *  
360 - * @param codeType 语言类型  
361 - * @param code 代码  
362 - * @return  
363 - */  
364 - public static List<CompletionChoice> getBugFixer(String codeType, String code) {  
365 - OpenAi openAi = PARMS.get("OpenAi22");  
366 - return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code, codeType));  
367 - }  
368 -  
369 - /**  
370 - * 自动为一个表格生成数据  
371 - *  
372 - * @param rows 生成的行数  
373 - * @param headers 数据表头,格式如:姓名| 年龄|性别|生日  
374 - * @return  
375 - */  
376 - public static List<CompletionChoice> getFillData(int rows, String headers) {  
377 - OpenAi openAi = PARMS.get("OpenAi23");  
378 - return getAiResult(openAi, String.format(openAi.getPrompt(), rows, headers));  
379 - }  
380 -  
381 - /**  
382 - * 各种开发语言的两天机器人  
383 - *  
384 - * @param question 你的问题  
385 - * @param programmingLanguages 语言 比如Java JavaScript  
386 - * @return  
387 - */  
388 - public static List<CompletionChoice> getProgrammingLanguageChatbot(String question, String programmingLanguages) {  
389 - OpenAi openAi = PARMS.get("OpenAi24");  
390 - return getAiResult(openAi, String.format(openAi.getPrompt(), question, programmingLanguages));  
391 - }  
392 -  
393 - /**  
394 - * 机器学习模型方面的机器人  
395 - *  
396 - * @param question 你的问题  
397 - * @return  
398 - */  
399 - public static List<CompletionChoice> getMLChatbot(String question) {  
400 - OpenAi openAi = PARMS.get("OpenAi25");  
401 - return getAiResult(openAi, String.format(openAi.getPrompt(), question));  
402 - }  
403 -  
404 - /**  
405 - * 可以列出各方面的分类列表,比如歌单  
406 - *  
407 - * @param text 清单描述  
408 - * @return  
409 - */  
410 - public static List<CompletionChoice> getListMaker(String text) {  
411 - OpenAi openAi = PARMS.get("OpenAi26");  
412 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
413 - }  
414 -  
415 - /**  
416 - * 对一段文字进行情绪分析  
417 - *  
418 - * @param text  
419 - * @return  
420 - */  
421 - public static List<CompletionChoice> getTweetClassifier(String text) {  
422 - OpenAi openAi = PARMS.get("OpenAi27");  
423 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
424 - }  
425 -  
426 - /**  
427 - * 抽取文本中的航空代码信息  
428 - *  
429 - * @param text  
430 - * @return  
431 - */  
432 - public static List<CompletionChoice> getAirportCodeExtractor(String text) {  
433 - OpenAi openAi = PARMS.get("OpenAi28");  
434 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
435 - }  
436 -  
437 - /**  
438 - * 无上下文,语句描述生成SQL  
439 - *  
440 - * @param text  
441 - * @return  
442 - */  
443 - public static List<CompletionChoice> getSQL(String text) {  
444 - OpenAi openAi = PARMS.get("OpenAi29");  
445 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
446 - }  
447 -  
448 - /**  
449 - * 从文本中抽取联系方式  
450 - *  
451 - * @param extractContent 抽取内容描述  
452 - * @param text  
453 - * @return 从下面文本中抽取邮箱和电话:\n教育行业A股IPO第一股(股票代码 003032)\n全国咨询/投诉热线:400-618-4000 举报邮箱:mc@itcast.cn  
454 - */  
455 - public static List<CompletionChoice> getExtractContactInformation(String extractContent, String text) {  
456 - OpenAi openAi = PARMS.get("OpenAi30");  
457 - return getAiResult(openAi, String.format(openAi.getPrompt(), extractContent, text));  
458 - }  
459 -  
460 - /**  
461 - * 把一种语言转成另外一种语言代码  
462 - *  
463 - * @param fromCodeType 当前代码类型  
464 - * @param toCodeType 转换的代码类型  
465 - * @param code  
466 - * @return  
467 - */  
468 - public static List<CompletionChoice> getTransformationCode(String fromCodeType, String toCodeType, String code) {  
469 - OpenAi openAi = PARMS.get("OpenAi31");  
470 - return getAiResult(openAi, String.format(openAi.getPrompt(), fromCodeType, toCodeType, fromCodeType, code, toCodeType));  
471 - }  
472 -  
473 - /**  
474 - * 模仿好友聊天  
475 - *  
476 - * @param question  
477 - * @return  
478 - */  
479 - public static List<CompletionChoice> getFriendChat(String question) {  
480 - OpenAi openAi = PARMS.get("OpenAi32");  
481 - return getAiResult(openAi, String.format(openAi.getPrompt(), question));  
482 - }  
483 -  
484 - /**  
485 - * 依据描述生成对应颜色  
486 - *  
487 - * @param text  
488 - * @return  
489 - */  
490 - public static List<CompletionChoice> getMoodToColor(String text) {  
491 - OpenAi openAi = PARMS.get("OpenAi33");  
492 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
493 - }  
494 -  
495 - /**  
496 - * 自动为程序生成文档  
497 - *  
498 - * @param codeType 语言  
499 - * @param code  
500 - * @return  
501 - */  
502 - public static List<CompletionChoice> getCodeDocument(String codeType, String code) {  
503 - OpenAi openAi = PARMS.get("OpenAi34");  
504 - return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code));  
505 - }  
506 -  
507 - /**  
508 - * 依据短语生成相关文短  
509 - *  
510 - * @param text 短语  
511 - * @return  
512 - */  
513 - public static List<CompletionChoice> getCreateAnalogies(String text) {  
514 - OpenAi openAi = PARMS.get("OpenAi35");  
515 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
516 - }  
517 -  
518 - /**  
519 - * 把多行代码简单的压缩成一行  
520 - *  
521 - * @param codeType 语言  
522 - * @param code  
523 - * @return  
524 - */  
525 - public static List<CompletionChoice> getCodeLine(String codeType, String code) {  
526 - OpenAi openAi = PARMS.get("OpenAi36");  
527 - return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code, codeType));  
528 - }  
529 -  
530 - /**  
531 - * 依据一个主题创建一个故事  
532 - *  
533 - * @param topic 创作主题  
534 - * @return  
535 - */  
536 - public static List<CompletionChoice> getStory(String topic) {  
537 - OpenAi openAi = PARMS.get("OpenAi37");  
538 - return getAiResult(openAi, String.format(openAi.getPrompt(), topic));  
539 - }  
540 -  
541 - /**  
542 - * 第一人称转第3人称  
543 - *  
544 - * @param text  
545 - * @return  
546 - */  
547 - public static List<CompletionChoice> getStoryCreator(String text) {  
548 - OpenAi openAi = PARMS.get("OpenAi38");  
549 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
550 - }  
551 -  
552 - /**  
553 - * 依据笔记生成摘要说明  
554 - *  
555 - * @param scene 生成的摘要场景  
556 - * @param note 记录的笔记  
557 - * @return  
558 - */  
559 - public static List<CompletionChoice> getNotesToSummary(String scene, String note) {  
560 - OpenAi openAi = PARMS.get("OpenAi39");  
561 - return getAiResult(openAi, String.format(openAi.getPrompt(), note));  
562 - }  
563 -  
564 - /**  
565 - * 给定一个主题,让其生成一些主题相关的想法  
566 - *  
567 - * @param topic 头脑风暴关键词  
568 - * @return  
569 - */  
570 - public static List<CompletionChoice> getIdeaGenerator(String topic) {  
571 - OpenAi openAi = PARMS.get("OpenAi40");  
572 - return getAiResult(openAi, String.format(openAi.getPrompt(), topic));  
573 - }  
574 -  
575 - /**  
576 - * 按照ESRB进行文本分类  
577 - *  
578 - * @param text 文本  
579 - * @return  
580 - */  
581 - public static List<CompletionChoice> getESRBRating(String text) {  
582 - OpenAi openAi = PARMS.get("OpenAi41");  
583 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
584 - }  
585 -  
586 - /**  
587 - * 按照提示为相关内容生成提纲  
588 - *  
589 - * @param text 场景,比如 数据库软件生成大学毕业论文  
590 - * @return  
591 - */  
592 - public static List<CompletionChoice> getEssayOutline(String text) {  
593 - OpenAi openAi = PARMS.get("OpenAi42");  
594 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
595 - }  
596 -  
597 - /**  
598 - * 依据美食名称和材料生成美食的制作步骤  
599 - *  
600 - * @param name 美食名称  
601 - * @param ingredients 美食食材  
602 - * @return  
603 - */  
604 - public static List<CompletionChoice> getRecipeCreator(String name, List<String> ingredients) {  
605 - OpenAi openAi = PARMS.get("OpenAi43");  
606 - StringJoiner joiner = new StringJoiner("\n");  
607 - for (String ingredient : ingredients) {  
608 - joiner.add(ingredient);  
609 - }  
610 - return getAiResult(openAi, String.format(openAi.getPrompt(), name, joiner.toString()));  
611 - }  
612 -  
613 - /**  
614 - * 与AI机器进行聊天  
615 - *  
616 - * @param question  
617 - * @return  
618 - */  
619 - public static List<CompletionChoice> getAiChatbot(String question) {  
620 - return getAiChatbot(question,null);  
621 - }  
622 -  
623 - /**  
624 - * 与AI机器进行聊天  
625 - *  
626 - * @param question  
627 - * @return  
628 - */  
629 - public static List<CompletionChoice> getAiChatbot(String question,String user) {  
630 - OpenAi openAi = PARMS.get("OpenAi44");  
631 - openAi.setUser(user);  
632 - return getAiResult(openAi, String.format(openAi.getPrompt(), question));  
633 - }  
634 -  
635 - /**  
636 - * 与讽刺机器进行聊天,聊天的机器人是一种消极情绪  
637 - *  
638 - * @param question  
639 - * @return  
640 - */  
641 - public static List<CompletionChoice> getMarvChatbot(String question) {  
642 - OpenAi openAi = PARMS.get("OpenAi45");  
643 - return getAiResult(openAi, String.format(openAi.getPrompt(), question));  
644 - }  
645 -  
646 - /**  
647 - * 把一段文本分解成几步来完成  
648 - *  
649 - * @param text  
650 - * @return  
651 - */  
652 - public static List<CompletionChoice> getTurnDirection(String text) {  
653 - OpenAi openAi = PARMS.get("OpenAi46");  
654 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
655 - }  
656 -  
657 - /**  
658 - * 依据文本内容自动生成点评  
659 - *  
660 - * @param text  
661 - * @return  
662 - */  
663 - public static List<CompletionChoice> getReviewCreator(String text) {  
664 - OpenAi openAi = PARMS.get("OpenAi47");  
665 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
666 - }  
667 -  
668 - /**  
669 - * 可以为学习知识自动解答  
670 - *  
671 - * @param text  
672 - * @return  
673 - */  
674 - public static List<CompletionChoice> getStudyNote(String text) {  
675 - OpenAi openAi = PARMS.get("OpenAi48");  
676 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
677 - }  
678 -  
679 - /**  
680 - * 生成面试题  
681 - *  
682 - * @param text  
683 - * @return  
684 - */  
685 - public static List<CompletionChoice> getInterviewQuestion(String text) {  
686 - OpenAi openAi = PARMS.get("OpenAi49");  
687 - System.out.println(String.format(openAi.getPrompt(), text));  
688 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
689 - }  
690 -  
691 - public static List<CompletionChoice> getChatGPT3_5(String text) {  
692 - OpenAi openAi = PARMS.get("OpenAi50");  
693 - System.out.println(String.format(openAi.getPrompt(), text));  
694 - return getAiResult(openAi, String.format(openAi.getPrompt(), text));  
695 - }  
696 -}  
1 -# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 获取ip地址开关 addressEnabled: false profile: D:/ruoyi/uploadPath # 开发环境配置 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 # 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/* mqtt: client: device_life: 180 # NameServer地址 rocketmq: name-server: 47.115.144.179:9876 # 默认的消息组 producer: group: deviceCommand send-message-timeout: 30000 send-topic: lh-chat-gpt send-tags: 1 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/openAiUserLogin/*,/chatGPTStream/upUserFlowPacketRemain chatgpt: token: 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 timeout: 5000