chat.html 7.4 KB
<!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, '&nbsp;&nbsp;&nbsp;&nbsp;');
                    $("#" + 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>