|
@@ -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,则会显示在右方
|
|
|
});
|