ChatGPT 前端流式数据如何处理?本文提供三种方案为你揭开疑惑【websocket、SSE、fetch Stream]

这篇具有很好参考价值的文章主要介绍了ChatGPT 前端流式数据如何处理?本文提供三种方案为你揭开疑惑【websocket、SSE、fetch Stream]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

当下chatGPT如此火热,很多开发者都想部署一个 自己的gpt站点,本文不细致讨论gpt部署,只是着重总结一下博主在接入gpt时对于内容流失输出的解决方案,【代码质量并不高,感兴趣的小伙伴可以简单参考】

第一种也是我个人比较推荐的方案:websocket

各个平台兼容性也比较友好,且支持小程序【小程序需要使用其内部自动的socket API,详情请参考其官方文档】

//使用WebSocket连接后端socket服务  注意此处wss 可以理解为https  ws为http
socket = new WebSocket("ws://chat.xxx.saybot.net/websocket/" + userStore.uid)

//监听onopen 成功触发表示连接socket服务成功
 socket.onopen = function () {
    console.log("😄您已成功接入websocket服务,开始解决你的问题")
    socket.send("")
 }

//收到消息事件 gpt响应会不断触发onmessage事件,其事件对象中会有流失输出的内容
  socket.onmessage = function (event) {
    try {
      const content = JSON.parse(event.data).content
      console.log('😄gpt 响应内容为',content)
    } catch (err) {
      switch (event.data) {
        case "[INTERRUPTED]":
        case "[MODEL_TIMEOUT]":
        case "TEMPERATURE_THRESHOLD":
        case "[TOKENS]":
          console.log("😄gpt 响应中断或者超时")
          event.target.close()
          break
        case "[DONE]":
          console.log("😄gpt 响应结束了")
          event.target.close()
          break
        default:
          console.log("😄message error", err)
          break
      }
    }
  }

  //连接关闭事件
  socket.onclose = function (event) {
    console.log("😄您已断开")
  
  }

  //发生了错误事件
  socket.onerror = function (e) {
    console.log(""连接错误,请联系开发者")
  }

 响应数据如下:

chatgpt-next-web流式,chatgpt,websocket

第二种就是SSE方案,

SSE方案和websocket类似,但其存在一个比较大的”遗憾“就是不支持小程序

npm  i event-source-polyfill    //首先需要下载改库到项目                

const eventSource = new EventSourcePolyfill("http:/xxxxxx/createSse", {
    headers: {
      uid: userStore.uid,    //此处可以携带你需要的headers

      token: localStorage.getItem("accessToken")
    }
  })



eventSource.onopen = event => {
    console.log("SSE 连接成功, 开始请求数据")
 }


 eventSource.onmessage = async event => {
    const { data, lastEventId } = event
 
    switch (lastEventId) {
      case "[INTERRUPTED]":
      case "[MODEL_TIMEOUT]":
      case "TEMPERATURE_THRESHOLD":
         console.log("😄gpt  回复超时或中断")
        event.target.close()
        beak
      case "[TOKENS]":
      case "[DONE]":
       console.log("😄gpt  回复完毕")
        event.target.close()
        break
      default:
        const content = JSON.parse(data).content
        console.log("😄gpt 回复:",content)
        break
    }
  }

 eventSource.onerror = event => {
   console.log("😄gpt onerror :",event)
  }

 解析输出数据如下:

 chatgpt-next-web流式,chatgpt,websocket

第三种方案就是strem流式方案

通过fetch 请求,获取stream流式数据,相对比较麻烦不推荐

export const postMessage = async data => {

  const res = await fetch("http://xxxxx/talkByStream", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      token: userStore.token
    },
    body: JSON.stringify(data)
  })
 
  if (res.status && res.status !== 200) {
    console.log('error',res)
  }

  return res?.body?.getReader(); //getReader()可以让调用者更方便字符内容的处理
}
调用fetch请求
const reader = await postMessage({
    conversation: messageListToConversation(messageList.value),
    userMessage: { role: "user", content },
    temperature: 0.9
})

 reader.read().then(async ({ value, done }) => {
    if (done) {
      return
    }
    let text = new TextDecoder().decode(value)
    const responseStatus = text.match(REGEXP_FINISH_STATUS)

    const matchs = text.match(REGEXP_CONTENT_ARR)
    for (let i = 0; i < matchs?. length; i++) {
      let [, content] = matchs[i].match(REGEXP_CONTENT)
      content = content.replace(/\\n/g, "\n")
      await sleep(90) //睡眠函数
 console.log(content )
    }
  } 

以上方案仅供参考,只是一个基础demo,实际使用需要调整,只是为大家提供一种思路,谢谢文章来源地址https://www.toymoban.com/news/detail-765741.html

到了这里,关于ChatGPT 前端流式数据如何处理?本文提供三种方案为你揭开疑惑【websocket、SSE、fetch Stream]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JavaScript前端接收流式数据

    在Java开发中,前端接收流式数据通常涉及到使用WebSocket 或Server-Sent Events(SSE)这样的技术。这两种技术都允许服务器推送实时数据到客户端,以便在浏览器中进行处理和更新。 1.  WebSocket: WebSocket是一种在单个 TCP 连接上进行全双工通信的协议。在Java 中,你可以使用Java

    2024年04月27日
    浏览(26)
  • SSE[Server-Sent Events]实现页面流式数据输出(模拟ChatGPT流式输出)

            服务端向客户端推送消息,除了用WebSocket可实现,还有一种服务器发送事件(Server-Sent Events)简称 SSE,这是一种服务器端到客户端(浏览器)的单向消息推送。ChatGPT 就是采用的 SSE。对于需要长时间等待响应的对话场景,ChatGPT 采用了一种巧妙的策略:它会将已经计算

    2024年01月22日
    浏览(50)
  • ChatGPT垂直行业私有数据知识库功能-咨询接口采用流式响应输出-JS和Golang实现流式响应

    近期开发私有数据知识库功能,想要实现和ChatGPT聊天效果类似的逐字流式输出展示效果。 GPT3.5本身就有流式聊天补全接口,后端Golang对接后,也需要能流式输出。下面就介绍下前端JS后端Golang来实现这种输出效果   大部分介绍是使用EventStream来实现,我现在不使用EventStream也

    2023年04月10日
    浏览(26)
  • 前端如何处理后端一次性传来的10w条数据?

    如果你在面试中被问到这个问题,你可以用下面的内容回答这个问题,如果你在工作中遇到这个问题,你应该先揍那个写 API 的人。 为了方便后续测试,我们可以使用node创建一个简单的服务器。 然后我们的前端由一个 HTML 文件和一个 JS 文件组成。 Index.html: Index.js: 好的,这

    2024年02月02日
    浏览(31)
  • chatgpt 1020 错误码成功解决(三种方案) Chatgpt Access denied Error code 1020如何解决?

    最近很多小伙伴在尝鲜chatGPT,使用中遇到网站的1020的错误码,博主也遇到了相似的问题,不同的人运行环境不一样,可能解决方案不一样,接下来为大家提供几种解决思路,博主通过这种方法成功解决了,希望能帮到大家。 从前两天网上开始一直开着的chatgpt网页突然打不开

    2024年02月12日
    浏览(32)
  • mysql JDBC的三种查询(普通、流式、游标)

    使用JDBC向mysql发送查询时,有三种方式: 常规查询:JDBC驱动会阻塞的一次性读取全部查询的数据到 JVM 内存中,或者分页读取 流式查询:每次执行rs.next时会判断数据是否需要从mysql服务器获取,如果需要触发读取一批数据(可能n行)加载到 JVM 内存进行业务处理 游标查询:

    2024年02月08日
    浏览(41)
  • 用【Java】调用百度千帆大模型并提供流式接口【SSE】响应

    接口地址: V1版本:https://apis.ydxiaoshuai.cn/xai/rest/llm/baidu/qianfan/chat?accessToken=ACCESSTOKENprompt=PROMPT V2版本使用WebFlux:https://apis.ydxiaoshuai.cn/xai/rest/llm/baidu/qianfan/v2/chat?accessToken=ACCESSTOKENprompt=PROMPT 请求方式:GET 参数替换: 替换ACCESSTOKEN为自己的 替换PROMPT为自己要提问的问题 注意:服务器带

    2024年04月24日
    浏览(31)
  • 简单的数据库连接与提供前端接口

    本文浅浅讲解一下,使用多种软件共同开发一个java工程。 这是我在windows系统上跑成功的一次设计: 逻辑图如下: idea,maven,jdk,git,jenkins,nginx,fiddler,chrome,mysql,navicat,tomcat,apifox idea:Docs maven:http:// maven.apache. org jdk:建议使用jdk.8,目前较为主流的jdk版本。百度安

    2024年02月03日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包