2 Commits 7d31d81d53 ... 2e3b9c8d03

Autore SHA1 Messaggio Data
  zhangyuantao 2e3b9c8d03 feat:更新至chatgpt的最新api 1 anno fa
  zhangyuantao 10749818a7 other:微调 1 anno fa

+ 1 - 1
src/main/java/com/tao/listener/StepExecutor.java

@@ -22,7 +22,7 @@ public class StepExecutor implements Runnable {
     public void startStreamTask() {
         try {
             System.out.println("=========> 启动成功!请访问:http://localhost:8085");
-            Runtime.getRuntime().exec("cmd /c start http://localhost:8085");
+//            Runtime.getRuntime().exec("cmd /c start http://localhost:8085");
         } catch (Exception ex) {
             ex.printStackTrace();
         }

BIN
src/main/resources/static/layui/modules/layim/dist/layim-assets/skin/1.jpg


+ 32 - 13
src/main/resources/templates/index.html

@@ -227,14 +227,14 @@
         // 页面加载初始化时触发
         $(function () {
             /* 删除之前的聊天记录 */
-            let cache =  layui.layim.cache();
+            let cache = layui.layim.cache();
             let local = layui.data('layim')[cache.mine.id]; //获取当前用户本地数据
             //删除本地聊天记录
             delete local.chatlog;
             //向localStorage同步数据
             layui.data('layim', {
                 key: cache.mine.id
-                ,value: local
+                , value: local
             });
 
             // 初始化时最小化聊天窗口
@@ -245,7 +245,7 @@
             // 向 chatgpt 表插入一个 myprompt 字段,如果该表不存在,则自动建立,用于存储聊天上下文
             layui.sessionData('chatgpt', {
                 key: 'myprompt'
-                , value: ''
+                , value: []
             });
 
             flashPages();
@@ -400,18 +400,20 @@
         layim.config({
             brief: true //是否简约模式(如果true则不显示主面板)
             , minRight: '370px' // 用户控制聊天面板最小化时、及新消息提示层的相对right的px坐标。
+            , initSkin: '5.jpg'
         }).chat({
             name: 'ChatGPT'
             , type: 'friend'
             , avatar: 'static/chatgpt.png'
             , id: -2
         });
+        layim.setChatMin();
 
         // 发送消息事件
         layim.on('sendMessage', function (res) {
             /* 获取聊天中对方的信息,并将状态装换为输入中 */
             let To = res.to;
-            if(To.type === 'friend'){
+            if (To.type === 'friend') {
                 layim.setChatStatus('<span style="color:#ffa502;">(๑・`◡´・๑) 正在努力输入…</span>');
             }
 
@@ -419,15 +421,17 @@
             let Mine = res.mine;
             /* 读取sessionData中的上下文,并将本次的问题添加到上下文后面 */
             let localChatGPT = layui.sessionData('chatgpt');
+            let message = layui.sessionData('chatgpt').myprompt
+            message.push({"role": "user", "content": Mine.content})
             layui.sessionData('chatgpt', {
                 key: 'myprompt'
-                , value: localChatGPT.myprompt + " Q1:" + Mine.content
+                , value: message
             });
 
             /* 发送ChatGPT请求,获取回答 */
             $.ajax({
                 type: 'post',
-                url: 'https://api.openai.com/v1/completions',
+                url: 'https://api.openai.com/v1/chat/completions',
                 // sk-xxxxxxxxx为OpenAI的api-key,每个账号有18美元的免费额度
                 headers: {
                     "Content-Type": "application/json",
@@ -435,27 +439,42 @@
                 },
                 dataType: 'json',
                 data: JSON.stringify({
-                    "prompt": layui.sessionData('chatgpt').myprompt,
-                    "max_tokens": 2048,
-                    "model": "text-davinci-003"
+                    "model": "gpt-3.5-turbo",
+                    "messages": layui.sessionData('chatgpt').myprompt
                 }),
                 success: function (res) {
+                    let message = layui.sessionData('chatgpt').myprompt
+                    message.push({"role": "assistant", "content": res.choices[0].message.content})
                     // 将ChatGPT的回答添加到上下文中
                     layui.sessionData('chatgpt', {
-                        key: 'myprompt'
-                        , value: layui.sessionData('chatgpt').myprompt + " A1:" + res.choices[0].text
+                        key: 'myprompt',
+                        value: message
                     });
+                    console.log(layui.sessionData('chatgpt').myprompt)
                     // 取消输入中状态,变为在线状态
                     layim.setChatStatus('<span style="color:#2ed573;">o( ̄▽ ̄)d 在线</span>');
                     // 回答可能为空,需要做下判断
-                    if (res.choices[0].text.trim().length != 0) {
+                    if (res.choices[0].message.content.trim().length != 0) {
+                        layim.getMessage({
+                            system: true //系统消息
+                            , id: -2 //聊天窗口ID
+                            , type: "friend" //聊天窗口类型
+                            , content: "当前聊天长度为" + res.usage.total_tokens + ", 超过4096后将会清除记忆哦~"
+                        });
+                        // 超过4096的token长度,清除记忆
+                        if (res.usage.total_tokens > 4096) {
+                            layui.sessionData('chatgpt', {
+                                key: 'myprompt',
+                                value: []
+                            });
+                        }
                         // 接受消息
                         layim.getMessage({
                             username: To.name //消息来源用户名
                             , avatar: To.avatar //消息来源用户头像
                             , id: To.id //消息的来源ID(如果是私聊,则是用户id,如果是群聊,则是群组id)
                             , type: To.type //聊天窗口来源类型,从发送消息传递的to里面获取
-                            , content: res.choices[0].text.replace(/A1:/g, '').replace(/A1:/g, '').trim() //消息内容
+                            , content: res.choices[0].message.content.trim() //消息内容
                             , fromid: To.id //消息的发送者id(比如群组中的某个消息发送者),可用于自动解决浏览器多窗口时的一些问题,不加会导致回答出现在聊天窗口的右边
                             , mine: false //是否我发送的消息,如果为true,则会显示在右方
                         });

+ 5 - 4
src/test/java/com/tao/ElementSyncApplicationTests.java

@@ -2,6 +2,7 @@ package com.tao;
 
 import cn.hutool.core.io.file.FileReader;
 import cn.hutool.core.util.ReUtil;
+import cn.hutool.core.util.RuntimeUtil;
 import com.tao.pojo.AppElement;
 import com.tao.pojo.AppPage;
 import com.tao.service.AppElementService;
@@ -10,7 +11,10 @@ import org.junit.jupiter.api.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import javax.xml.bind.DatatypeConverter;
+import java.io.*;
 import java.util.ArrayList;
+import java.util.Base64;
 import java.util.List;
 import java.util.regex.Pattern;
 
@@ -21,10 +25,7 @@ class ElementSyncApplicationTests {
     AppElementService appElementService;
 
     @Test
-    void contextLoads() {
-        // List<AppElement> agree = appElementService.selectAppElementListFuzzy(new AppElement(null, "agree", null, null, null, null, null, null));
-        // System.out.println("agree = " + agree);
-        System.out.println("测试代码");
+    void contextLoads() throws InterruptedException {
     }
 
 }