http event-stream 流数据的AI聊天

  • Creator 版本: cocos creator 2.4.14

  • 目标平台: iOS / Android

  • 重现方式:模拟器 真机必现

公司有个基于大模型AI聊天的项目,聊天数据使用http post,字节流的方式返回,完成代码后再浏览器上运行是没有问题的,但是模拟器或者真机,这个http请求直接报了超时,然后走了onerror方法,感觉cocos还没直接event-stream的链接方式,想请教一下如何解决。

下面我会贴上我的请求代码

//发送聊天请求

private static ChatCurrentRequest: XMLHttpRequest | null = null; // 维护一个全局的 xhr 变量

public static SendChatMessage(url: string, params: any, options: { onFinish?: () => void, onProgress?: (responseText: string) => void, onError?: (error: any) => void }){

    let isFinish = false;

    const { onFinish = () => {}, onProgress = () => {}, onError = () => {} } = options;

    // 先中断上一个请求(如果有的话)

    if (this.ChatCurrentRequest) {

        this.ChatCurrentRequest.abort();

    }



    var xhr = new XMLHttpRequest();

    this.ChatCurrentRequest = xhr; //记录请求

    xhr.open('POST', url, true);

    xhr.setRequestHeader('Content-Type', 'application/json');

    xhr.setRequestHeader('Accept', 'text/event-stream');



    xhr.onreadystatechange = function () {

        if (xhr.readyState == XMLHttpRequest.DONE) {

            if(xhr.status != 200 ){

                if(xhr.status==0){

                    onFinish();

                    return;

                }

                onError(xhr.response);

                return;

            }

            if (!isFinish) {

                onFinish();

                isFinish = true;

            }

        }

    };



    xhr.onerror = function () {

        HttpUtil.ChatCurrentRequest = null;

        onError(null);

    }



    let oldText = '';

    xhr.onprogress = function () {

        let newResponse = xhr.response.replace(oldText, '');

        oldText += newResponse; // 更新 oldText,确保完整记录流式返回的数据

        let req = HttpUtil.decode(newResponse);



        if (req && req.length >= 1) {

            req.forEach(data => {

                if (data == '[DONE]') {

                    if (!isFinish) {

                        onFinish();

                        isFinish = true;

                    }

                    return;

                }

            });

            onProgress(req);  // 这里把 req 传递给回调函数

        } else {

            console.error('消息解析异常:', newResponse);

        }

    }



    xhr.send(JSON.stringify(params));

}

老哥,您解决了这个sse的问题了吗?

我用的是cocos creator 2.4.14,然后我这里是让服务端给我推socket来模拟流数据了。
如果你想用http去解决这个问题,要去改cocos http类的源代码,或者换成3.8吧

1赞

每一次发消息都会开一个websocket吗?

不用的,我集成的第三方的socket.io,其实底层就是websocket,就是和服务端建立好连接,服务端处理大模型用http流数据传过来的AI回复,然后每次收到都用socket推送过来,你就负责写显示逻辑就好了,可以实现的