作者 钟来

修改bug

@@ -63,7 +63,7 @@ @@ -63,7 +63,7 @@
63 <artifactId>swagger-bootstrap-ui</artifactId> 63 <artifactId>swagger-bootstrap-ui</artifactId>
64 <version>${swagger-ui.version}</version> 64 <version>${swagger-ui.version}</version>
65 </dependency> 65 </dependency>
66 - </dependencies> 66 +</dependencies>
67 67
68 <build> 68 <build>
69 <finalName>lh-alarm</finalName> 69 <finalName>lh-alarm</finalName>
  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-openai</artifactId>
  13 +
  14 + <dependencies>
  15 + <!-- spring-boot-devtools -->
  16 + <dependency>
  17 + <groupId>org.springframework.boot</groupId>
  18 + <artifactId>spring-boot-devtools</artifactId>
  19 + <optional>true</optional> <!-- 表示依赖不会传递 -->
  20 + </dependency>
  21 +
  22 + <!-- Mysql驱动包 -->
  23 + <dependency>
  24 + <groupId>mysql</groupId>
  25 + <artifactId>mysql-connector-java</artifactId>
  26 + </dependency>
  27 +
  28 + <!-- 核心模块-->
  29 + <dependency>
  30 + <groupId>com.zhonglai.luhui</groupId>
  31 + <artifactId>ruoyi-framework</artifactId>
  32 + </dependency>
  33 + <!-- 文档 -->
  34 + <dependency >
  35 + <groupId>io.springfox</groupId>
  36 + <artifactId>springfox-swagger2</artifactId>
  37 + <version>${swagger.version}</version>
  38 + <exclusions>
  39 + <exclusion>
  40 + <groupId>io.swagger</groupId>
  41 + <artifactId>swagger-models</artifactId>
  42 + </exclusion>
  43 + <exclusion>
  44 + <groupId>com.google.guava</groupId>
  45 + <artifactId>guava</artifactId>
  46 + </exclusion>
  47 + </exclusions>
  48 + </dependency>
  49 + <!--https://mvnrepository.com/artifact/io.swagger/swagger-models-->
  50 + <dependency>
  51 + <groupId>io.swagger</groupId>
  52 + <artifactId>swagger-models</artifactId>
  53 + <version>${swagger-models.version}</version>
  54 + </dependency>
  55 + <dependency>
  56 + <groupId>io.springfox</groupId>
  57 + <artifactId>springfox-swagger-ui</artifactId>
  58 + <version>${swagger.version}</version>
  59 + </dependency>
  60 + <!--&lt;!&ndash; https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui &ndash;&gt;-->
  61 + <dependency>
  62 + <groupId>com.github.xiaoymin</groupId>
  63 + <artifactId>swagger-bootstrap-ui</artifactId>
  64 + <version>${swagger-ui.version}</version>
  65 + </dependency>
  66 +
  67 + <dependency>
  68 + <groupId>com.theokanning.openai-gpt3-java</groupId>
  69 + <artifactId>service</artifactId>
  70 + <version>0.10.0</version>
  71 + <exclusions>
  72 + <exclusion>
  73 + <groupId>com.squareup.okhttp3</groupId>
  74 + <artifactId>okhttp</artifactId>
  75 + </exclusion>
  76 + </exclusions>
  77 + </dependency>
  78 + <dependency>
  79 + <groupId>com.squareup.okhttp3</groupId>
  80 + <artifactId>okhttp</artifactId>
  81 + <version>4.10.0</version>
  82 + </dependency>
  83 + </dependencies>
  84 +
  85 + <build>
  86 + <finalName>lh-openai</finalName>
  87 + <plugins>
  88 + <plugin>
  89 + <groupId>org.apache.maven.plugins</groupId>
  90 + <artifactId>maven-jar-plugin</artifactId>
  91 + <version>2.4</version>
  92 + <configuration>
  93 + <archive>
  94 + <!--
  95 + 生成的jar中,不要包含pom.xml和pom.properties这两个文件
  96 + -->
  97 + <addMavenDescriptor>false</addMavenDescriptor>
  98 + <manifest>
  99 + <!--
  100 + 是否要把第三方jar放到manifest的classpath中
  101 + -->
  102 + <addClasspath>true</addClasspath>
  103 +
  104 + <!--
  105 + 生成的manifest中classpath的前缀,因为要把第三方jar放到lib目录下,所以classpath的前缀是lib/
  106 + -->
  107 + <classpathPrefix>lib/</classpathPrefix>
  108 + <mainClass>com.zhonglai.luhui.alarm.AlarmApplication</mainClass>
  109 + </manifest>
  110 + </archive>
  111 + </configuration>
  112 + </plugin>
  113 +
  114 + <!-- The configuration of maven-assembly-plugin -->
  115 + <plugin>
  116 + <groupId>org.apache.maven.plugins</groupId>
  117 + <artifactId>maven-assembly-plugin</artifactId>
  118 + <version>2.4</version>
  119 + <configuration>
  120 + <descriptors>
  121 + <descriptor>src/main/resources/package.xml</descriptor>
  122 + </descriptors>
  123 + </configuration>
  124 + <executions>
  125 + <execution>
  126 + <id>make-assembly</id>
  127 + <phase>package</phase>
  128 + <goals>
  129 + <goal>single</goal>
  130 + </goals>
  131 + </execution>
  132 + </executions>
  133 + </plugin>
  134 + </plugins>
  135 + </build>
  136 +</project>
  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 +)
  30 +@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
  31 +public class OpenaiApplication {
  32 + public static void main(String[] args) {
  33 + SpringApplication.run(OpenaiApplication.class,args);
  34 + System.out.println("启动成功");
  35 + }
  36 +}
  1 +package com.zhonglai.luhui.openai.controller;
  2 +
  3 +import com.ruoyi.common.core.domain.Message;
  4 +import com.ruoyi.common.core.domain.MessageCode;
  5 +import com.theokanning.openai.completion.CompletionChoice;
  6 +import com.zhonglai.luhui.openai.utils.OpenAiUtils;
  7 +import io.swagger.annotations.Api;
  8 +import io.swagger.annotations.ApiOperation;
  9 +import org.springframework.web.bind.annotation.*;
  10 +
  11 +import java.util.List;
  12 +
  13 +@Api(tags = "chatGPT接口")
  14 +@RestController
  15 +@RequestMapping("/chatgpt")
  16 +public class ChatGPTController {
  17 + @ApiOperation("与AI机器进行聊天")
  18 + @RequestMapping(value = "/aiChatbot",method = RequestMethod.POST)
  19 + public Message aiChatbot(@RequestBody String data)
  20 + {
  21 + List<CompletionChoice> list = OpenAiUtils.getAiChatbot(data);
  22 + return new Message(MessageCode.DEFAULT_SUCCESS_CODE,list);
  23 + }
  24 +}
  1 +package com.zhonglai.luhui.openai.pojos;
  2 +
  3 +
  4 +/**
  5 + * 实体类
  6 + */
  7 +public class OpenAi {
  8 + String id;
  9 + String name;
  10 + String desc;
  11 + String model;
  12 + // 提示模板
  13 + String prompt;
  14 + // 创新采样
  15 + Double temperature;
  16 + // 情绪采样
  17 + Double topP;
  18 + // 结果条数
  19 + Double n = 1d;
  20 + // 频率处罚系数
  21 + Double frequencyPenalty;
  22 + // 重复处罚系数
  23 + Double presencePenalty;
  24 + // 停用词
  25 + String stop;
  26 +
  27 + public OpenAi() {
  28 + }
  29 +
  30 + public OpenAi(String id, String name, String desc, String model, String prompt, Double temperature, Double topP, Double n, Double frequencyPenalty, Double presencePenalty, String stop) {
  31 + this.id = id;
  32 + this.name = name;
  33 + this.desc = desc;
  34 + this.model = model;
  35 + this.prompt = prompt;
  36 + this.temperature = temperature;
  37 + this.topP = topP;
  38 + this.n = n;
  39 + this.frequencyPenalty = frequencyPenalty;
  40 + this.presencePenalty = presencePenalty;
  41 + this.stop = stop;
  42 + }
  43 +
  44 + public String getId() {
  45 + return id;
  46 + }
  47 +
  48 + public void setId(String id) {
  49 + this.id = id;
  50 + }
  51 +
  52 + public String getName() {
  53 + return name;
  54 + }
  55 +
  56 + public void setName(String name) {
  57 + this.name = name;
  58 + }
  59 +
  60 + public String getDesc() {
  61 + return desc;
  62 + }
  63 +
  64 + public void setDesc(String desc) {
  65 + this.desc = desc;
  66 + }
  67 +
  68 + public String getModel() {
  69 + return model;
  70 + }
  71 +
  72 + public void setModel(String model) {
  73 + this.model = model;
  74 + }
  75 +
  76 + public String getPrompt() {
  77 + return prompt;
  78 + }
  79 +
  80 + public void setPrompt(String prompt) {
  81 + this.prompt = prompt;
  82 + }
  83 +
  84 + public Double getTemperature() {
  85 + return temperature;
  86 + }
  87 +
  88 + public void setTemperature(Double temperature) {
  89 + this.temperature = temperature;
  90 + }
  91 +
  92 + public Double getTopP() {
  93 + return topP;
  94 + }
  95 +
  96 + public void setTopP(Double topP) {
  97 + this.topP = topP;
  98 + }
  99 +
  100 + public Double getN() {
  101 + return n;
  102 + }
  103 +
  104 + public void setN(Double n) {
  105 + this.n = n;
  106 + }
  107 +
  108 + public Double getFrequencyPenalty() {
  109 + return frequencyPenalty;
  110 + }
  111 +
  112 + public void setFrequencyPenalty(Double frequencyPenalty) {
  113 + this.frequencyPenalty = frequencyPenalty;
  114 + }
  115 +
  116 + public Double getPresencePenalty() {
  117 + return presencePenalty;
  118 + }
  119 +
  120 + public void setPresencePenalty(Double presencePenalty) {
  121 + this.presencePenalty = presencePenalty;
  122 + }
  123 +
  124 + public String getStop() {
  125 + return stop;
  126 + }
  127 +
  128 + public void setStop(String stop) {
  129 + this.stop = stop;
  130 + }
  131 +}
  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.properties;
  2 +
  3 +import com.ruoyi.common.config.RuoYiConfig;
  4 +import io.swagger.annotations.ApiOperation;
  5 +import org.springframework.beans.factory.annotation.Autowired;
  6 +import org.springframework.context.annotation.Bean;
  7 +import org.springframework.context.annotation.Configuration;
  8 +import springfox.documentation.builders.ApiInfoBuilder;
  9 +import springfox.documentation.builders.PathSelectors;
  10 +import springfox.documentation.builders.RequestHandlerSelectors;
  11 +import springfox.documentation.service.ApiInfo;
  12 +import springfox.documentation.service.Contact;
  13 +import springfox.documentation.spi.DocumentationType;
  14 +import springfox.documentation.spring.web.plugins.Docket;
  15 +import springfox.documentation.swagger2.annotations.EnableSwagger2;
  16 +
  17 +
  18 +@Configuration
  19 +@EnableSwagger2
  20 +public class SwaggerConfig {
  21 + /** 系统基础配置 */
  22 + @Autowired
  23 + private RuoYiConfig ruoyiConfig;
  24 + @Bean
  25 + public Docket createRestApi() {
  26 + return new Docket(DocumentationType.SWAGGER_2)
  27 + .apiInfo(apiInfo())
  28 + .select()
  29 + .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
  30 + .paths(PathSelectors.any())
  31 + .build();
  32 + }
  33 +
  34 + /**
  35 + * 添加摘要信息
  36 + */
  37 + private ApiInfo apiInfo()
  38 + {
  39 + // 用ApiInfoBuilder进行定制
  40 + return new ApiInfoBuilder()
  41 + // 设置标题
  42 + .title("标题:chatgpt接口")
  43 + // 描述
  44 + .description("描述:用于chatgpt")
  45 + // 作者信息
  46 + .contact(new Contact(ruoyiConfig.getName(), null, null))
  47 + // 版本
  48 + .version("版本号:" + ruoyiConfig.getVersion())
  49 + .build();
  50 + }
  51 +
  52 +}
  1 +package com.zhonglai.luhui.openai.service;
  2 +
  3 +import com.ruoyi.common.exception.ServiceException;
  4 +import com.ruoyi.common.utils.StringUtils;
  5 +import com.ruoyi.system.login.dto.ApiLoginUser;
  6 +import com.ruoyi.system.login.dto.Yu2leUserInfo;
  7 +import com.ruoyi.system.login.dto.Yu2leUserLogin;
  8 +import com.ruoyi.system.service.PublicService;
  9 +import org.slf4j.Logger;
  10 +import org.slf4j.LoggerFactory;
  11 +import org.springframework.beans.factory.annotation.Autowired;
  12 +import org.springframework.security.core.userdetails.UserDetails;
  13 +import org.springframework.security.core.userdetails.UserDetailsService;
  14 +import org.springframework.security.core.userdetails.UsernameNotFoundException;
  15 +import org.springframework.stereotype.Service;
  16 +
  17 +@Service
  18 +public class ChatgptDetailsServiceImpl implements UserDetailsService {
  19 + private static final Logger log = LoggerFactory.getLogger(ChatgptDetailsServiceImpl.class);
  20 + @Autowired
  21 + private PublicService publicService;
  22 + @Override
  23 + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  24 + Yu2leUserLogin yu2leUserLogin = publicService.getObjectForTableName(Yu2leUserLogin.class,"loginName",username,"`liu_yu_le`.`user_login`");
  25 + Yu2leUserInfo yu2leUserInfo = publicService.getObjectForTableName(Yu2leUserInfo.class,"loginName",username,"`liu_yu_le`.`user_info`");;
  26 + if (StringUtils.isNull(yu2leUserLogin) || StringUtils.isNull(yu2leUserInfo))
  27 + {
  28 + log.info("登录用户:{} 不存在.", username);
  29 + throw new ServiceException("登录用户:" + username + " 不存在");
  30 + }
  31 + else if (1==yu2leUserInfo.getIsInvalid())
  32 + {
  33 + log.info("登录用户:{} 已被停用.", username);
  34 + throw new ServiceException("对不起,您的账号:" + username + " 已停用");
  35 + }
  36 + return new ApiLoginUser(yu2leUserInfo, yu2leUserLogin);
  37 + }
  38 +}
  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 + }
  68 +
  69 + public static String OPENAPI_TOKEN = "";
  70 + public static Integer TIMEOUT = null;
  71 +
  72 + /**
  73 + * 获取ai
  74 + *
  75 + * @param openAi
  76 + * @param prompt
  77 + * @return
  78 + */
  79 + public static List<CompletionChoice> getAiResult(OpenAi openAi, String prompt) {
  80 + if (TIMEOUT == null || TIMEOUT < 1000) {
  81 + TIMEOUT = 3000;
  82 + }
  83 + OpenAiService service = new OpenAiService(OPENAPI_TOKEN, TIMEOUT);
  84 + CompletionRequest.CompletionRequestBuilder builder = CompletionRequest.builder()
  85 + .model(openAi.getModel())
  86 + .prompt(prompt)
  87 + .temperature(openAi.getTemperature())
  88 + .maxTokens(1000)
  89 + .topP(openAi.getTopP())
  90 + .frequencyPenalty(openAi.getFrequencyPenalty())
  91 + .presencePenalty(openAi.getPresencePenalty());
  92 + if (!StringUtils.isEmpty(openAi.getStop())) {
  93 + builder.stop(Arrays.asList(openAi.getStop().split(",")));
  94 + }
  95 + CompletionRequest completionRequest = builder.build();
  96 + return service.createCompletion(completionRequest).getChoices();
  97 + }
  98 +
  99 + /**
  100 + * 问答
  101 + *
  102 + * @param question
  103 + * @return
  104 + */
  105 + public static List<CompletionChoice> getQuestionAnswer(String question) {
  106 + OpenAi openAi = PARMS.get("OpenAi01");
  107 + return getAiResult(openAi, String.format(openAi.getPrompt(), question));
  108 + }
  109 +
  110 + /**
  111 + * 语法纠错
  112 + *
  113 + * @param text
  114 + * @return
  115 + */
  116 + public static List<CompletionChoice> getGrammarCorrection(String text) {
  117 + OpenAi openAi = PARMS.get("OpenAi02");
  118 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  119 + }
  120 +
  121 + /**
  122 + * 将一段话,概况中心
  123 + *
  124 + * @param text
  125 + * @return
  126 + */
  127 + public static List<CompletionChoice> getSummarize(String text) {
  128 + OpenAi openAi = PARMS.get("OpenAi03");
  129 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  130 + }
  131 +
  132 + /**
  133 + * 一句话生成OpenAi的代码
  134 + *
  135 + * @param text
  136 + * @return
  137 + */
  138 + public static List<CompletionChoice> getOpenAiApi(String text) {
  139 + OpenAi openAi = PARMS.get("OpenAi04");
  140 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  141 + }
  142 +
  143 + /**
  144 + * 一句话生成程序的命令,目前支持操作系统指令比较多
  145 + *
  146 + * @param text
  147 + * @return
  148 + */
  149 + public static List<CompletionChoice> getTextToCommand(String text) {
  150 + OpenAi openAi = PARMS.get("OpenAi05");
  151 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  152 + }
  153 +
  154 + /**
  155 + * 把一种语法翻译成其它几种语言
  156 + *
  157 + * @param text
  158 + * @return
  159 + */
  160 + public static List<CompletionChoice> getTranslatesLanguages(String text, String translatesLanguages) {
  161 + if (StringUtils.isEmpty(translatesLanguages)) {
  162 + translatesLanguages = " 1. French, 2. Spanish and 3. English";
  163 + }
  164 + OpenAi openAi = PARMS.get("OpenAi06");
  165 + return getAiResult(openAi, String.format(openAi.getPrompt(), translatesLanguages, text));
  166 + }
  167 +
  168 + /**
  169 + * 一句话生成Stripe国际支付API
  170 + *
  171 + * @param text
  172 + * @return
  173 + */
  174 + public static List<CompletionChoice> getStripeApi(String text) {
  175 + OpenAi openAi = PARMS.get("OpenAi07");
  176 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  177 + }
  178 +
  179 +
  180 + /**
  181 + * 依据上下文中的表信息,生成SQL语句
  182 + *
  183 + * @param databaseType 数据库类型
  184 + * @param tables 上午依赖的表和字段 Employee(id, name, department_id)
  185 + * @param text SQL描述
  186 + * @param sqlType sql类型,比如SELECT
  187 + * @return
  188 + */
  189 + public static List<CompletionChoice> getStripeApi(String databaseType, List<String> tables, String text, String sqlType) {
  190 + OpenAi openAi = PARMS.get("OpenAi08");
  191 + StringJoiner joiner = new StringJoiner("\n");
  192 + for (int i = 0; i < tables.size(); i++) {
  193 + joiner.add("# " + tables);
  194 + }
  195 + return getAiResult(openAi, String.format(openAi.getPrompt(), databaseType, joiner.toString(), text, sqlType));
  196 + }
  197 +
  198 + /**
  199 + * 对于非结构化的数据抽取其中的特征生成结构化的表格
  200 + *
  201 + * @param text 非结构化的数据
  202 + * @return
  203 + */
  204 + public static List<CompletionChoice> getUnstructuredData(String text) {
  205 + OpenAi openAi = PARMS.get("OpenAi09");
  206 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  207 + }
  208 +
  209 + /**
  210 + * 把一段信息继续分类
  211 + *
  212 + * @param text 要分类的文本
  213 + * @return
  214 + */
  215 + public static List<CompletionChoice> getTextCategory(String text) {
  216 + OpenAi openAi = PARMS.get("OpenAi10");
  217 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  218 + }
  219 +
  220 + /**
  221 + * 把一段信息继续分类
  222 + *
  223 + * @param codeType 代码类型,比如Python
  224 + * @param code 要解释的代码
  225 + * @return
  226 + */
  227 + public static List<CompletionChoice> getCodeExplain(String codeType, String code) {
  228 + OpenAi openAi = PARMS.get("OpenAi11");
  229 + return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code));
  230 + }
  231 +
  232 + /**
  233 + * 将文本编码成表情服务
  234 + *
  235 + * @param text 文本
  236 + * @return
  237 + */
  238 + public static List<CompletionChoice> getTextEmoji(String text) {
  239 + OpenAi openAi = PARMS.get("OpenAi12");
  240 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  241 + }
  242 +
  243 + /**
  244 + * 求一段代码的时间复杂度
  245 + *
  246 + * @param code 代码
  247 + * @return
  248 + */
  249 + public static List<CompletionChoice> getTimeComplexity(String code) {
  250 + OpenAi openAi = PARMS.get("OpenAi13");
  251 + return getAiResult(openAi, String.format(openAi.getPrompt(), code));
  252 + }
  253 +
  254 +
  255 + /**
  256 + * 把一种语言的代码翻译成另外一种语言的代码
  257 + *
  258 + * @param fromLanguage 要翻译的代码语言
  259 + * @param toLanguage 要翻译成的代码语言
  260 + * @param code 代码
  261 + * @return
  262 + */
  263 + public static List<CompletionChoice> getTranslateProgramming(String fromLanguage, String toLanguage, String code) {
  264 + OpenAi openAi = PARMS.get("OpenAi14");
  265 + return getAiResult(openAi, String.format(openAi.getPrompt(), fromLanguage, toLanguage, fromLanguage, code, toLanguage));
  266 + }
  267 +
  268 + /**
  269 + * 支持批量列表的方式检查情绪
  270 + *
  271 + * @param texts 文本
  272 + * @return
  273 + */
  274 + public static List<CompletionChoice> getBatchTweetClassifier(List<String> texts) {
  275 + OpenAi openAi = PARMS.get("OpenAi15");
  276 + StringJoiner stringJoiner = new StringJoiner("\n");
  277 + for (int i = 0; i < texts.size(); i++) {
  278 + stringJoiner.add((i + 1) + ". " + texts.get(i));
  279 + }
  280 + return getAiResult(openAi, String.format(openAi.getPrompt(), stringJoiner.toString()));
  281 + }
  282 +
  283 + /**
  284 + * 对一段代码进行解释
  285 + *
  286 + * @param code 文本
  287 + * @return
  288 + */
  289 + public static List<CompletionChoice> getExplainCOde(String code) {
  290 + OpenAi openAi = PARMS.get("OpenAi16");
  291 + return getAiResult(openAi, String.format(openAi.getPrompt(), code));
  292 + }
  293 +
  294 + /**
  295 + * 提取一段文本中的关键字
  296 + *
  297 + * @param text 文本
  298 + * @return
  299 + */
  300 + public static List<CompletionChoice> getTextKeywords(String text) {
  301 + OpenAi openAi = PARMS.get("OpenAi17");
  302 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  303 + }
  304 +
  305 + /**
  306 + * 事实回答答题
  307 + *
  308 + * @param text 文本
  309 + * @return
  310 + */
  311 + public static List<CompletionChoice> getFactualAnswering(String text) {
  312 + OpenAi openAi = PARMS.get("OpenAi18");
  313 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  314 + }
  315 +
  316 + /**
  317 + * 给一个产品设计一个广告
  318 + *
  319 + * @param text 文本
  320 + * @return
  321 + */
  322 + public static List<CompletionChoice> getAd(String text) {
  323 + OpenAi openAi = PARMS.get("OpenAi19");
  324 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  325 + }
  326 +
  327 + /**
  328 + * 依据产品描述和种子词语,给一个产品取一个好听的名字
  329 + *
  330 + * @param productDescription 产品描述
  331 + * @param seedWords 种子词语
  332 + * @return
  333 + */
  334 + public static List<CompletionChoice> getProductName(String productDescription, String seedWords) {
  335 + OpenAi openAi = PARMS.get("OpenAi20");
  336 + return getAiResult(openAi, String.format(openAi.getPrompt(), productDescription, seedWords));
  337 + }
  338 +
  339 + /**
  340 + * 把一个长句子简化成一个短句子
  341 + *
  342 + * @param text 长句子
  343 + * @return
  344 + */
  345 + public static List<CompletionChoice> getProductName(String text) {
  346 + OpenAi openAi = PARMS.get("OpenAi21");
  347 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  348 + }
  349 +
  350 + /**
  351 + * 自动修改代码中的bug
  352 + *
  353 + * @param codeType 语言类型
  354 + * @param code 代码
  355 + * @return
  356 + */
  357 + public static List<CompletionChoice> getBugFixer(String codeType, String code) {
  358 + OpenAi openAi = PARMS.get("OpenAi22");
  359 + return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code, codeType));
  360 + }
  361 +
  362 + /**
  363 + * 自动为一个表格生成数据
  364 + *
  365 + * @param rows 生成的行数
  366 + * @param headers 数据表头,格式如:姓名| 年龄|性别|生日
  367 + * @return
  368 + */
  369 + public static List<CompletionChoice> getFillData(int rows, String headers) {
  370 + OpenAi openAi = PARMS.get("OpenAi23");
  371 + return getAiResult(openAi, String.format(openAi.getPrompt(), rows, headers));
  372 + }
  373 +
  374 + /**
  375 + * 各种开发语言的两天机器人
  376 + *
  377 + * @param question 你的问题
  378 + * @param programmingLanguages 语言 比如Java JavaScript
  379 + * @return
  380 + */
  381 + public static List<CompletionChoice> getProgrammingLanguageChatbot(String question, String programmingLanguages) {
  382 + OpenAi openAi = PARMS.get("OpenAi24");
  383 + return getAiResult(openAi, String.format(openAi.getPrompt(), question, programmingLanguages));
  384 + }
  385 +
  386 + /**
  387 + * 机器学习模型方面的机器人
  388 + *
  389 + * @param question 你的问题
  390 + * @return
  391 + */
  392 + public static List<CompletionChoice> getMLChatbot(String question) {
  393 + OpenAi openAi = PARMS.get("OpenAi25");
  394 + return getAiResult(openAi, String.format(openAi.getPrompt(), question));
  395 + }
  396 +
  397 + /**
  398 + * 可以列出各方面的分类列表,比如歌单
  399 + *
  400 + * @param text 清单描述
  401 + * @return
  402 + */
  403 + public static List<CompletionChoice> getListMaker(String text) {
  404 + OpenAi openAi = PARMS.get("OpenAi26");
  405 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  406 + }
  407 +
  408 + /**
  409 + * 对一段文字进行情绪分析
  410 + *
  411 + * @param text
  412 + * @return
  413 + */
  414 + public static List<CompletionChoice> getTweetClassifier(String text) {
  415 + OpenAi openAi = PARMS.get("OpenAi27");
  416 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  417 + }
  418 +
  419 + /**
  420 + * 抽取文本中的航空代码信息
  421 + *
  422 + * @param text
  423 + * @return
  424 + */
  425 + public static List<CompletionChoice> getAirportCodeExtractor(String text) {
  426 + OpenAi openAi = PARMS.get("OpenAi28");
  427 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  428 + }
  429 +
  430 + /**
  431 + * 无上下文,语句描述生成SQL
  432 + *
  433 + * @param text
  434 + * @return
  435 + */
  436 + public static List<CompletionChoice> getSQL(String text) {
  437 + OpenAi openAi = PARMS.get("OpenAi29");
  438 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  439 + }
  440 +
  441 + /**
  442 + * 从文本中抽取联系方式
  443 + *
  444 + * @param extractContent 抽取内容描述
  445 + * @param text
  446 + * @return 从下面文本中抽取邮箱和电话:\n教育行业A股IPO第一股(股票代码 003032)\n全国咨询/投诉热线:400-618-4000 举报邮箱:mc@itcast.cn
  447 + */
  448 + public static List<CompletionChoice> getExtractContactInformation(String extractContent, String text) {
  449 + OpenAi openAi = PARMS.get("OpenAi30");
  450 + return getAiResult(openAi, String.format(openAi.getPrompt(), extractContent, text));
  451 + }
  452 +
  453 + /**
  454 + * 把一种语言转成另外一种语言代码
  455 + *
  456 + * @param fromCodeType 当前代码类型
  457 + * @param toCodeType 转换的代码类型
  458 + * @param code
  459 + * @return
  460 + */
  461 + public static List<CompletionChoice> getTransformationCode(String fromCodeType, String toCodeType, String code) {
  462 + OpenAi openAi = PARMS.get("OpenAi31");
  463 + return getAiResult(openAi, String.format(openAi.getPrompt(), fromCodeType, toCodeType, fromCodeType, code, toCodeType));
  464 + }
  465 +
  466 + /**
  467 + * 模仿好友聊天
  468 + *
  469 + * @param question
  470 + * @return
  471 + */
  472 + public static List<CompletionChoice> getFriendChat(String question) {
  473 + OpenAi openAi = PARMS.get("OpenAi32");
  474 + return getAiResult(openAi, String.format(openAi.getPrompt(), question));
  475 + }
  476 +
  477 + /**
  478 + * 依据描述生成对应颜色
  479 + *
  480 + * @param text
  481 + * @return
  482 + */
  483 + public static List<CompletionChoice> getMoodToColor(String text) {
  484 + OpenAi openAi = PARMS.get("OpenAi33");
  485 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  486 + }
  487 +
  488 + /**
  489 + * 自动为程序生成文档
  490 + *
  491 + * @param codeType 语言
  492 + * @param code
  493 + * @return
  494 + */
  495 + public static List<CompletionChoice> getCodeDocument(String codeType, String code) {
  496 + OpenAi openAi = PARMS.get("OpenAi34");
  497 + return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code));
  498 + }
  499 +
  500 + /**
  501 + * 依据短语生成相关文短
  502 + *
  503 + * @param text 短语
  504 + * @return
  505 + */
  506 + public static List<CompletionChoice> getCreateAnalogies(String text) {
  507 + OpenAi openAi = PARMS.get("OpenAi35");
  508 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  509 + }
  510 +
  511 + /**
  512 + * 把多行代码简单的压缩成一行
  513 + *
  514 + * @param codeType 语言
  515 + * @param code
  516 + * @return
  517 + */
  518 + public static List<CompletionChoice> getCodeLine(String codeType, String code) {
  519 + OpenAi openAi = PARMS.get("OpenAi36");
  520 + return getAiResult(openAi, String.format(openAi.getPrompt(), codeType, code, codeType));
  521 + }
  522 +
  523 + /**
  524 + * 依据一个主题创建一个故事
  525 + *
  526 + * @param topic 创作主题
  527 + * @return
  528 + */
  529 + public static List<CompletionChoice> getStory(String topic) {
  530 + OpenAi openAi = PARMS.get("OpenAi37");
  531 + return getAiResult(openAi, String.format(openAi.getPrompt(), topic));
  532 + }
  533 +
  534 + /**
  535 + * 第一人称转第3人称
  536 + *
  537 + * @param text
  538 + * @return
  539 + */
  540 + public static List<CompletionChoice> getStoryCreator(String text) {
  541 + OpenAi openAi = PARMS.get("OpenAi38");
  542 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  543 + }
  544 +
  545 + /**
  546 + * 依据笔记生成摘要说明
  547 + *
  548 + * @param scene 生成的摘要场景
  549 + * @param note 记录的笔记
  550 + * @return
  551 + */
  552 + public static List<CompletionChoice> getNotesToSummary(String scene, String note) {
  553 + OpenAi openAi = PARMS.get("OpenAi39");
  554 + return getAiResult(openAi, String.format(openAi.getPrompt(), note));
  555 + }
  556 +
  557 + /**
  558 + * 给定一个主题,让其生成一些主题相关的想法
  559 + *
  560 + * @param topic 头脑风暴关键词
  561 + * @return
  562 + */
  563 + public static List<CompletionChoice> getIdeaGenerator(String topic) {
  564 + OpenAi openAi = PARMS.get("OpenAi40");
  565 + return getAiResult(openAi, String.format(openAi.getPrompt(), topic));
  566 + }
  567 +
  568 + /**
  569 + * 按照ESRB进行文本分类
  570 + *
  571 + * @param text 文本
  572 + * @return
  573 + */
  574 + public static List<CompletionChoice> getESRBRating(String text) {
  575 + OpenAi openAi = PARMS.get("OpenAi41");
  576 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  577 + }
  578 +
  579 + /**
  580 + * 按照提示为相关内容生成提纲
  581 + *
  582 + * @param text 场景,比如 数据库软件生成大学毕业论文
  583 + * @return
  584 + */
  585 + public static List<CompletionChoice> getEssayOutline(String text) {
  586 + OpenAi openAi = PARMS.get("OpenAi42");
  587 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  588 + }
  589 +
  590 + /**
  591 + * 依据美食名称和材料生成美食的制作步骤
  592 + *
  593 + * @param name 美食名称
  594 + * @param ingredients 美食食材
  595 + * @return
  596 + */
  597 + public static List<CompletionChoice> getRecipeCreator(String name, List<String> ingredients) {
  598 + OpenAi openAi = PARMS.get("OpenAi43");
  599 + StringJoiner joiner = new StringJoiner("\n");
  600 + for (String ingredient : ingredients) {
  601 + joiner.add(ingredient);
  602 + }
  603 + return getAiResult(openAi, String.format(openAi.getPrompt(), name, joiner.toString()));
  604 + }
  605 +
  606 + /**
  607 + * 与AI机器进行聊天
  608 + *
  609 + * @param question
  610 + * @return
  611 + */
  612 + public static List<CompletionChoice> getAiChatbot(String question) {
  613 + OpenAi openAi = PARMS.get("OpenAi44");
  614 + return getAiResult(openAi, String.format(openAi.getPrompt(), question));
  615 + }
  616 +
  617 + /**
  618 + * 与讽刺机器进行聊天,聊天的机器人是一种消极情绪
  619 + *
  620 + * @param question
  621 + * @return
  622 + */
  623 + public static List<CompletionChoice> getMarvChatbot(String question) {
  624 + OpenAi openAi = PARMS.get("OpenAi45");
  625 + return getAiResult(openAi, String.format(openAi.getPrompt(), question));
  626 + }
  627 +
  628 + /**
  629 + * 把一段文本分解成几步来完成
  630 + *
  631 + * @param text
  632 + * @return
  633 + */
  634 + public static List<CompletionChoice> getTurnDirection(String text) {
  635 + OpenAi openAi = PARMS.get("OpenAi46");
  636 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  637 + }
  638 +
  639 + /**
  640 + * 依据文本内容自动生成点评
  641 + *
  642 + * @param text
  643 + * @return
  644 + */
  645 + public static List<CompletionChoice> getReviewCreator(String text) {
  646 + OpenAi openAi = PARMS.get("OpenAi47");
  647 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  648 + }
  649 +
  650 + /**
  651 + * 可以为学习知识自动解答
  652 + *
  653 + * @param text
  654 + * @return
  655 + */
  656 + public static List<CompletionChoice> getStudyNote(String text) {
  657 + OpenAi openAi = PARMS.get("OpenAi48");
  658 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  659 + }
  660 +
  661 + /**
  662 + * 生成面试题
  663 + *
  664 + * @param text
  665 + * @return
  666 + */
  667 + public static List<CompletionChoice> getInterviewQuestion(String text) {
  668 + OpenAi openAi = PARMS.get("OpenAi49");
  669 + System.out.println(String.format(openAi.getPrompt(), text));
  670 + return getAiResult(openAi, String.format(openAi.getPrompt(), text));
  671 + }
  672 +
  673 +}
  1 +# 数据源配置
  2 +spring:
  3 + datasource:
  4 + type: com.alibaba.druid.pool.DruidDataSource
  5 + driverClassName: com.mysql.cj.jdbc.Driver
  6 + druid:
  7 + # 主库数据源
  8 + master:
  9 + url: jdbc:mysql://rm-wz9740un21f09iokuao.mysql.rds.aliyuncs.com:3306/mqtt_broker?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
  10 + username: luhui
  11 + password: Luhui586
  12 + # 从库数据源
  13 + slave:
  14 + # 从数据源开关/默认关闭
  15 + enabled: false
  16 + url:
  17 + username:
  18 + password:
  19 + # 初始连接数
  20 + initialSize: 5
  21 + # 最小连接池数量
  22 + minIdle: 10
  23 + # 最大连接池数量
  24 + maxActive: 20
  25 + # 配置获取连接等待超时的时间
  26 + maxWait: 60000
  27 + # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
  28 + timeBetweenEvictionRunsMillis: 60000
  29 + # 配置一个连接在池中最小生存的时间,单位是毫秒
  30 + minEvictableIdleTimeMillis: 300000
  31 + # 配置一个连接在池中最大生存的时间,单位是毫秒
  32 + maxEvictableIdleTimeMillis: 900000
  33 + # 配置检测连接是否有效
  34 + validationQuery: SELECT 1 FROM DUAL
  35 + testWhileIdle: true
  36 + testOnBorrow: false
  37 + testOnReturn: false
  38 + webStatFilter:
  39 + enabled: true
  40 + statViewServlet:
  41 + enabled: true
  42 + # 设置白名单,不填则允许所有访问
  43 + allow:
  44 + url-pattern: /druid/*
  45 + # 控制台管理用户名和密码
  46 + login-username: ruoyi
  47 + login-password: 123456
  48 + filter:
  49 + stat:
  50 + enabled: true
  51 + # 慢SQL记录
  52 + log-slow-sql: true
  53 + slow-sql-millis: 1000
  54 + merge-sql: true
  55 + wall:
  56 + config:
  57 + multi-statement-allow: true
  1 +# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 获取ip地址开关 addressEnabled: false # 开发环境配置 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,/chatgpt/aiChatbot chatgpt: token: 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 timeout: 5000
  1 +{
  2 + "userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
  3 + "cfClearance": "TQGfn7M2Bcs8orogGzH3W.IPzJT3K_qJ9l_71ohooho-1676276962-0-1-f17cd819.14bb9dea.a67d87f9-160",
  4 + "session_token" : "eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..l1ZTOzatjL-w2_7B.JTf72KXAHoaYza4pYgzsWIhYNzhw24i86YEt8WQ12lDyqWybWXPVzgcOf2iYMhe7LqIqo8KoDM8HxxqSarUjxLVuJ2pL4wrri_9AincvR2phvXY_51O-QKSesBVHgGgh_rnv9Vlgpcjw2_k5a9p6jC9kf2zB7qFFArNo5b3Y19hZlfSkPgxJVT_cSfQH9pEq93HvJJjwGLzoNybF8I-zuEtSVTZ1iWvXzvH-wvLwxP8i97OSowzhhyygtU_sP6se5f54zG0_ElVGCHcXxggT2-qREqMSUyNDq0rv4chfWZengBXw2CpkzhF_uA1C-SPSrHY0Mn-KER4W279gnjMYwQgt886E31Euo9c_uG-eljD2NV9lgRJdSxzG_SREqkp9ubYq_3UYFeLwE_oUt61ii88ND-mTBRf2kVD3YCZne1Y-xDTHutdqNCNZJJPI2Zq5aNObKU1BCrp3PCCDMmjGSfhg-HdZdqeE5rXCHBXcEE2HrGbRLtylXYrYy5ttVeHZH7OKDyBaCC2lfXK1nFjvtLigVfJlXJF5lnVhIlFQe-kxjro3NUqw4RjdGoA7SJi0zpsAOB1Y7cY4Qb2WC_vjD5OBSNHceOox3WDkQt8LA-E4_PqhnBvAOYnaPBbX4eJT836OTiy12FhxnOiKxQLO9xdMnYoV3P9g2wkPqAJb5lWGYN_GqJIgiuV9Z9zN3R5N6WSryYOwzAXd3ocYODexh4U19T8JVWjxL7lurv-qBtr2wZPDNBS8U2y5sp49EgTnMswiqUnB624m7oFpgukiY9ZtEootaKEUk876-MVN5WeWOx2kQNL6ptNvhFaaqCVr6iQzrwMxYUiz_A1NhRVoO2gmYvWuC7Hxu28qwzFOubY9JRoOto-EPeqWxy9s9xmJ_19xHBpV2ZbGzPx-iwOLK_HWGiPScgAL6enWpoxWJ0XnEhEL5pghLcEuz9NAIzwVxsvLgslmkaTIFsTyP0CssyIJWv7oB75_cPGv3QqOI76Hz8A7J7C27hNKVy0f6XHoACFY6cyXx0jMYlOJW3e5GCv03Ht6SfvZPs8gNwpAuTz7JF0VliozvDLx7CM5SrBIt_iJnUZ_RM_8GBmorR1KThMtKDuvfkFNZN9dRPDVhMt7AGpZlKoJpADxH9lB7srNVSSr95PnZmsz4zwep8m_yYM9yjMTiIDn0dJifaEe_NH1Yda86yXTxhqAdD8j7ZbqvGGl75W_Ru-kvuB6hvE6PWy_6_IxwHrrDSwELjPwpgyacpJ3e2mGwAP1pkozJLWRJJkTlD-CR-PeBIhiFKk0FuKdXqnxtk4TghB7yqpUE25fLAhFu2yRNlR9jyXRPc8_mUWIyX3fcS0QDlaUY6YYGu5RlaomW5MztW80ij_h3YSObiLJbRjZe4bUWC7-p48a2YMOlDLIq6OcsXKd4ToBO3sFbnsmKUDqTt4TdU-prLwRCs1rqeRY1--vjGb8Zlju0T1-JrSJ4UimWm9CcFMz4JvuMXieVEKQ4TlVKseKM1t7jkNZmdBl4eoJth1lJvvVhlYTduxA8mumZAYjnCb-IT1pmKOxJkKtdjHwfCfEp7Jb4NcGrjfvMCOJzIyzM8GCf7gz8J-701g-BCRLPFQvER_t5pF6Re6GO8B3fHtrBQP8jxJNmM5yYl3YLFbWcYpNRBCMbuyIY88z4ALZ2Y-aXhkdTCX-_nVUDoz5PqEb20S7HJ6nkLHpNf9L95AZsZGfww9cfU5YjJs-8COD5ScOltZdEeTfUY2Q6qeM6N3p3wIREGKM6cqGFTyME1pPScNz-3ld0Fc5w3XHlU_o_DRt0TS8WMEG2chUtECsCy2M2J9Kytd2IOQLTSDIhGSCv6syiv8jVSUKThi3aQxdSk-t-cDWe9HjyIjdZ1lh9oNUa2-o7XKGg43TOgnUNUkHAEgfhD8LUPlwqUxJ6a0BDRltgVYnH7vGgPukiKXE-Li7Ks_HGgQodQowAucB9WKtkjdvU4iAtfKgcZXawci-vWM4EKLL8bpbR2MVUqDs7ie_d-Qzcxc9g_qEtWlByiil4zNUmwU3XGHp4nSHopWD1TiDZPDw5XgaXpAOukwFmrMzzvBE50uSowubbW1hbcKjVhmlZGgG6s0rwMwLugWio1tD-FJ4UgoaKxY65_j8vZhmuNZv_uIRgUHyAfJ2O3v-VBMmIHwrtfwUE-uHdCwW-RnjsGlxAI7sSKHpRV736pqukeC_XGEshq2Zv13S3Lt0MzL02P34kV3RD7n2OealEyxsuk_uexQo6DshiWw60pEgPwc12A7cYSWQODD7vJnkjXlFUPykNmqKSBTf1jhmIUWkEQBolEe7GjCb5YpZl5CZLiEN6v6WlOGOjW-o5UgT_egb7N4gu4Tj-6tv5PAZ3-lf8PUDzJ2reVhYkp_ToKdZ96aOhDQ7PFAqBYDc8A8om-zhF5A_zOeJmgAYEP3DNqE9P-PvC-1tn_kV99pfHD2ciVBXONCillWYLam1oOA3n2ABrHxvMg.0phK2SHDerfwz7VPG4rzhQ"
  5 +}
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<!DOCTYPE configuration
  3 +PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  4 +"http://mybatis.org/dtd/mybatis-3-config.dtd">
  5 +<configuration>
  6 + <!-- 全局参数 -->
  7 + <settings>
  8 + <!-- 使全局的映射器启用或禁用缓存 -->
  9 + <setting name="cacheEnabled" value="true" />
  10 + <!-- 允许JDBC 支持自动生成主键 -->
  11 + <setting name="useGeneratedKeys" value="true" />
  12 + <!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
  13 + <setting name="defaultExecutorType" value="SIMPLE" />
  14 + <!-- 指定 MyBatis 所用日志的具体实现 -->
  15 + <setting name="logImpl" value="SLF4J" />
  16 + <!-- 使用驼峰命名法转换字段 -->
  17 + <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
  18 + </settings>
  19 +
  20 +</configuration>
  1 +<?xml version="1.0" encoding="UTF-8"?>
  2 +
  3 +<assembly>
  4 + <id>bin</id>
  5 + <!-- 最终打包成一个用于发布的zip文件 -->
  6 + <formats>
  7 + <format>zip</format>
  8 + </formats>
  9 +
  10 + <!-- Adds dependencies to zip package under lib directory -->
  11 + <dependencySets>
  12 + <dependencySet>
  13 + <!--
  14 + 不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录
  15 + -->
  16 + <useProjectArtifact>false</useProjectArtifact>
  17 + <outputDirectory>lib</outputDirectory>
  18 + <unpack>false</unpack>
  19 + </dependencySet>
  20 + </dependencySets>
  21 +
  22 + <fileSets>
  23 + <!-- 把项目相关的说明文件,打包进zip文件的根目录 -->
  24 + <fileSet>
  25 + <directory>${project.basedir}</directory>
  26 + <outputDirectory>/</outputDirectory>
  27 + <includes>
  28 + <include>README*</include>
  29 + <include>LICENSE*</include>
  30 + <include>NOTICE*</include>
  31 + </includes>
  32 + </fileSet>
  33 +
  34 + <!-- 把项目的配置文件,打包进zip文件的config目录 -->
  35 + <fileSet>
  36 + <directory>${project.basedir}\src\main\resources\configs</directory>
  37 + <outputDirectory>../configs</outputDirectory>
  38 + <includes>
  39 + <include>*.properties</include>
  40 + </includes>
  41 + </fileSet>
  42 +
  43 + <!-- 把项目的配置文件,提出来 -->
  44 + <fileSet>
  45 + <directory>${project.basedir}\src\main\resources</directory>
  46 + <outputDirectory>/</outputDirectory>
  47 + <includes>
  48 + <include>*.properties</include>
  49 + <include>*.yml</include>
  50 + </includes>
  51 + </fileSet>
  52 +
  53 + <!-- 把项目的脚本文件目录( src/main/scripts )中的启动脚本文件,打包进zip文件的跟目录 -->
  54 + <fileSet>
  55 + <directory>${project.basedir}\bin</directory>
  56 + <outputDirectory></outputDirectory>
  57 + <includes>
  58 + <include>start.*</include>
  59 + <include>stop.*</include>
  60 + </includes>
  61 + </fileSet>
  62 +
  63 + <!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 -->
  64 + <fileSet>
  65 + <directory>${project.build.directory}</directory>
  66 + <outputDirectory></outputDirectory>
  67 + <includes>
  68 + <include>*.jar</include>
  69 + </includes>
  70 + </fileSet>
  71 + </fileSets>
  72 +</assembly>
@@ -19,6 +19,7 @@ @@ -19,6 +19,7 @@
19 <module>lh-central-control</module> 19 <module>lh-central-control</module>
20 <module>lh-backups</module> 20 <module>lh-backups</module>
21 <module>lh-alarm</module> 21 <module>lh-alarm</module>
  22 + <module>lh-openai</module>
22 </modules> 23 </modules>
23 24
24 <packaging>pom</packaging> 25 <packaging>pom</packaging>