chat.html
7.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale-1.0">
<title>Title</title>
</head>
<body>
<div id="results">
</div>
<script>
const eventSource = new EventSource('/chat.php');
eventSource.addEventListener('message', function ( event) {
console.log(111);
document.querySelector("#results").innerHTML += event.data;
})
// console.log(eventSource);
// // eventSource.onmessage(function (event) {
// // document.querySelector("#results").innerHTML += event.data;
// // })
// console.log(1)
// eventSource.onmessage = function (event) {
// console.log(event);
//
// //var data = JSON.parse(event.data);
// //$('#msgCount').text(data + "</br>")
// document.querySelector("#results").innerHTML += event.data + '<br>';
// };
// console.log(2)
// eventSource.addEventListener('message', function ( event) {
// console.log(111);
// document.querySelector("#results").innerHTML += event.data;
// })
function streaming() {
var es = new EventSource("chat.php");
var isstarted = true;
var alltext = "";
var isalltext = false;
es.onerror = function (event) {
// layer.close(loading);
// var errcode = getCookie("errcode");
// switch (errcode) {
// case "invalid_api_key":
// layer.msg("API-KEY不合法");
// break;
// case "context_length_exceeded":
// layer.msg("问题和上下文长度超限,请重新提问");
// break;
// case "rate_limit_reached":
// layer.msg("同时访问用户过多,请稍后再试");
// break;
// case "access_terminated":
// layer.msg("违规使用,API-KEY被封禁");
// break;
// case "no_api_key":
// layer.msg("未提供API-KEY");
// break;
// case "insufficient_quota":
// layer.msg("API-KEY余额不足");
// break;
// case "account_deactivated":
// layer.msg("账户已禁用");
// break;
// case "model_overloaded":
// layer.msg("OpenAI模型超负荷,请重新发起请求");
// break;
// case null:
// layer.msg("OpenAI服务器访问超时或未知类型错误");
// break;
// default:
// layer.msg("OpenAI服务器故障,错误类型:" + errcode);
// }
// es.close();
// if (!isMobile()) $("#kw-target").focus();
// return;
}
es.onmessage = function (event) {
if (isstarted) {
layer.close(loading);
$("#kw-target").val("请耐心等待AI把话说完……");
$("#kw-target").attr("disabled", true);
autoresize();
$("#ai-btn").html('<i class="iconfont icon-wuguan"></i>中止');
layer.msg("处理成功!");
isstarted = false;
answer = randomString(16);
$("#article-wrapper").append('<li class="article-title" id="q' + answer + '"><pre></pre></li>');
for (var j = 0; j < prompt.length; j++) {
$("#q" + answer).children('pre').text($("#q" + answer).children('pre').text() + prompt[j]);
}
$("#article-wrapper").append('<li class="article-content" id="' + answer + '"></li>');
let str_ = '';
let i = 0;
timer = setInterval(() => {
let newalltext = alltext;
let islastletter = false;
//有时服务器错误地返回\\n作为换行符,尤其是包含上下文的提问时,这行代码可以处理一下。
if (newalltext.split("\n\n").length == newalltext.split("\n").length) {
newalltext = newalltext.replace(/\\n/g, '\n');
}
if (str_.length < newalltext.length) {
str_ += newalltext[i++];
strforcode = str_ + "_";
if ((str_.split("```").length % 2) == 0) strforcode += "\n```\n";
} else {
if (isalltext) {
clearInterval(timer);
strforcode = str_;
islastletter = true;
$("#kw-target").val("");
$("#kw-target").attr("disabled", false);
autoresize();
$("#ai-btn").html('<i class="iconfont icon-wuguan"></i>发送');
if (!isMobile()) $("#kw-target").focus();
}
}
//let arr = strforcode.split("```");
//for (var j = 0; j <= arr.length; j++) {
// if (j % 2 == 0) {
// arr[j] = arr[j].replace(/\n\n/g, '\n');
// arr[j] = arr[j].replace(/\n/g, '\n\n');
// arr[j] = arr[j].replace(/\t/g, '\\t');
// arr[j] = arr[j].replace(/\n {4}/g, '\n\\t');
// arr[j] = $("<div>").text(arr[j]).html();
// }
//}
//var converter = new showdown.Converter();
//newalltext = converter.makeHtml(arr.join("```"));
newalltext = mdHtml.render(strforcode);
//newalltext = newalltext.replace(/\\t/g, ' ');
$("#" + answer).html(newalltext);
if (islastletter) MathJax.Hub.Queue(["Typeset", MathJax.Hub]);
//if (document.querySelector("[id='" + answer + "']" + " pre code")) document.querySelectorAll("[id='" + answer + "']" + " pre code").forEach(el => { hljs.highlightElement(el); });
$("#" + answer + " pre code").each(function () {
$(this).html("<button onclick='copycode(this);' class='codebutton'>复制</button>" + $(this).html());
});
document.getElementById("article-wrapper").scrollTop = 100000;
}, 30);
}
if (event.data == "[DONE]") {
isalltext = true;
contextarray.push([prompt, alltext]);
contextarray = contextarray.slice(-5); //只保留最近5次对话作为上下文,以免超过最大tokens限制
es.close();
return;
}
var json = eval("(" + event.data + ")");
if (json.choices[0].delta.hasOwnProperty("content")) {
if (alltext == "") {
alltext = json.choices[0].delta.content.replace(/^\n+/, ''); //去掉回复消息中偶尔开头就存在的连续换行符
} else {
alltext += json.choices[0].delta.content;
}
}
}
}
</script>
</body>
</html>