使用自定义流事件处理实现EventStream流式输出

解决大模型接口POST请求的自定义数据流处理
文章讲述了作者在项目中遇到的问题,需通过POST请求接入大模型接口,但接口仅支持GET。作者探索了多种方式后,发现需自定义数据流处理,实现方法包括使用`fetch`、`AbortController`和生成数据流的读取器。

项目遇到一个需求,接入大模型接口,我一开始想的是使用接口交互式,产品经理跟我说用sse,于是我就去了解了一下sse连接方式,以及websocket,长短轮询等。

以上方式不赘述了,因为我也是一知半解

接入之后我傻眼了,因为接口是post请求,而sse方式只支持get请求。于是我从阿里千问下手,我发现他的接口也是post请求,又于是我找资料,问AI,都没什么效果。最终在一篇文章找到了实现方式。

https://blog.youkuaiyun.com/dreams_dream/article/details/132342097

这种方式应该算自定义数据流处理因为ai是这么跟我说的,于是有了下面的实现方法:

单独封装了请求方法,需要小伙伴们自改

// aiOps.js
export function streamDialogue(data,signal) {
    return fetch(
        '你的接口地址',
        {
            method: 'post',
            headers: new Headers({
                'Content-Type': 'application/json', //使用接口支持的格式
            }),
            body: JSON.stringify({ status: 0, text: data }),
            signal,
        }
    )
}
import { streamDialogue } from '@/api/monitor/aiOps'
// 生成数据
async generate() {
    // 创建一个新的 AbortController 对象,用于取消 fetch 请求
    this.controller = new AbortController()
    try {
        // 调用 streamDialogue 函数,发送 POST 请求到服务器,并获取响应
        const response = await streamDialogue(
            this.input,
            this.controller.signal
        )

        // 从响应中获取数据流的读取器
        const reader = response.body.getReader()

        // eslint-disable-next-line no-constant-condition
        while (true) {
            // 从数据流中读取一段数据
            const { done, value } = await reader.read()

            // 如果数据流已经结束,跳出循环
            if (done) {
                break
            }

            // 将数据解码为 UTF-8 字符串
            const str = new TextDecoder('utf-8').decode(value)

            // 打印字符串
            console.log(str)
        }
    } catch (error) {
        // 如果在生成数据的过程中发生错误,打印错误信息,并设置 isStopped 为 true
        console.error('An error occurred:', error)
        this.isStopped = true
    } finally {
        // 不论是否发生错误,最后都要调用 controller.abort() 取消请求
        this.controller.abort()
    }
},

    // 停止生成数据
    stopGenerating() {
        // 调用 controller.abort() 取消请求
        this.controller.abort()
        // 设置 isStopped 为 true
        this.isStopped = true
    },

        // 重新开始生成数据
        restartGenerating() {
            this.generate()
        },

看着有点多其实也不多😥,注释是ai给的,附上效果截图,后续完善了会修改内容。
​​​​在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值