前端如何处理AI模型返回的流数据

1.首先,使用什么请求方式

这里采用的是fetch请求方式获取流数据。 Fetch 支持可读流,适用于大文件下载。

代码示例:

javascript 复制代码
fetch(import.meta.env.VITE_AI_API + "/ai/task/stream", {
    method: 'post',
    body: JSON.stringify(params),
    headers: {
      "Content-Type": "application/json",
    },
  }).then(respose => {
    if (respose.status === 200) {
      return respose.body
    }
  })
    .then(rb => {
      return promiseHandleReader(rb!.getReader())
    })
    .catch(error => {
      console.log("error is ", error)
      btnLoading.value =  false
      spinning.value = false
      message.error('生成失败!')
    })

2.流数据

ai模型返回的流数据如下:

3.如何从流数据里获取最后完整的json数据

需要注意的是,ai模型每次返回的流数据,里面有个text字段,正如上图中的text属性。然后是将不断输出的text字段,拼接出一个完整的json数据。那么如何拼接出一个完整的json呢?代码如下

javascript 复制代码
const topicJson = ref('')
const topicInfoObj = ref({})
let streamString = '' // 所有流式输出的拼接

function promiseHandleReader(reader) {
  return new Promise((resolve, reject) => {
    loopRead(reader, resolve, reject)
  }).then(() => {// 读取完所有流数据后,开始处理
    const resArr = extractDataBetween(streamString)
    const resArrNoEmpty = resArr.filter(item => !!item)
    resArrNoEmpty.forEach(item => {
      const obj = JSON.parse(item)
      topicJson.value += obj.result.output.text
    })
    topicInfoObj.value = JSON.parse(topicJson.value)

  })
    .catch(err => {
      console.log(err);
    })
}

// 递归读取流数据
function loopRead(reader, resolve, reject) {
  return reader.read().then(({ done, value }) => {
    if (done) {
      resolve(true)
      return
    }
    const decodeString = new TextDecoder().decode(value)
    streamString += decodeString
    return loopRead(reader, resolve, reject)
  })
}

// 处理所有流式数据拼接的完整数据,取出data:规则后的字符数据
function extractDataBetween(str: string) {
  const regex = /data:([\s\S]*?)(?=data:|$)/g;
  const result = [];
  let match;

  // 循环匹配所有符合条件的内容
  while ((match = regex.exec(str)) !== null) {
    // 将分组1的内容加入数组(即data:后面的分段内容)
    result.push(match[1]);
  }

  return result;
}

async function handleGenerateTopic() {
  topicJson.value = ''
  streamString = ''
  const params = {...} // 参数
  fetch(import.meta.env.VITE_AI_API + "/ai/task/stream", {
    method: 'post',
    body: JSON.stringify(params),
    headers: {
      "Content-Type": "application/json",
    },
  }).then(respose => {
    if (respose.status === 200) {
      return respose.body
    }
  })
    .then(rb => {
      return promiseHandleReader(rb!.getReader())
    })
    .catch(error => {
      console.log("error is ", error)
      message.error('生成失败!')
    })
}
相关推荐
H03111698511 分钟前
App竞品数据查询工具整理 月狐数据 蝉大师 点点数据功能概览
人工智能
叠层归一研究院43 分钟前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi
IT_陈寒1 小时前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
why-geo1 小时前
Hermes Agent 与 Python 的会产生什么样的碰撞
人工智能·python·ai编程
卡布鲁1 小时前
React useMemo 与 useCallback 完全指南:原理、场景与避坑
前端·react.js
正经教主1 小时前
【FDE系列】阶段2:Day 29:FastAPI 进阶 — Pydantic 模型与完整 CRUD 实战
人工智能·python·fde
碳基修炼1 小时前
排查记:本地 devServer 是 http,浏览器却把 302 重定向升级成了 https
前端·http
时速GEO系统1 小时前
初元 AI V1.1 版本升级,首个正式版发布一周・实现生成、部署、上线、优化全流程自动化闭环
人工智能·数据挖掘·node.js
步行cgn1 小时前
Spring p 命名空间注入详解
java·前端·spring
咕泡科技1 小时前
咕泡科技FDE系列最新产品重磅发布!
人工智能·大模型·ai落地·fde·前沿部署工程师