Parcourir la source

feat:更新至chatgpt的最新api

zhangyuantao il y a 1 an
Parent
commit
2e3b9c8d03

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


+ 31 - 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,6 +400,7 @@
         layim.config({
             brief: true //是否简约模式(如果true则不显示主面板)
             , minRight: '370px' // 用户控制聊天面板最小化时、及新消息提示层的相对right的px坐标。
+            , initSkin: '5.jpg'
         }).chat({
             name: 'ChatGPT'
             , type: 'friend'
@@ -412,7 +413,7 @@
         layim.on('sendMessage', function (res) {
             /* 获取聊天中对方的信息,并将状态装换为输入中 */
             let To = res.to;
-            if(To.type === 'friend'){
+            if (To.type === 'friend') {
                 layim.setChatStatus('<span style="color:#ffa502;">(๑・`◡´・๑) 正在努力输入…</span>');
             }
 
@@ -420,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",
@@ -436,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,则会显示在右方
                         });