首页 > 其他分享 >GPT打字机效果—— fetchEventSouce进行sse流式请求

GPT打字机效果—— fetchEventSouce进行sse流式请求

时间:2024-01-10 16:12:54浏览次数:31  
标签:console log err fetchEventSouce GPT sse new event

需求背景

在GPT爆发的时候,各项目都想给自己的产品加上AI,蹭上AI的风口,因此在最近的一个需求,就想要给项目加入Ai的功能,原本要求的效果是,查询到对应的数据后,完全展示出来,也就是常规的post请求,后来这种效果遇到了一个很现实的问题:长时间的等待。我们需要在GPT返回全部数据后,前端才能接受并展示,一旦询问的时间过长,就会让用户等待很久,这时候我们需要将前端的展示效果改为想ChatGPT那样的打字机效果。
预计的效果如下图:
image

实现

像这种效果我们很容易就能想到,前端与后端是需要建立连接的,一般前后端建立连接我们第一时间想到的是利用websocket建立通信。但是websocket是双向的,不仅前端需要接受信息,后端也需要接受信息,但是像GPT我们进行询问时,其实只需要前端实时接受信息即可,后端是不需要实时的接受前端的信息。因此我们使用比websocket更加轻量的通信协议:EventStream

EventStream基本用法

与 WebSocket 不同的是,服务器发送事件是单向的。数据消息只能从服务端到发送到客户端(如用户的浏览器)。这使其成为不需要从客户端往服务器发送消息的情况下的最佳选择。

const evtSource = new EventSource("/api/v1/sse")
// 每次连接开启时调用
evtSource.onopen = function () {
  console.log("连接开始启动");
};
// 每次接受数据时调用
evtSource.onmessage = (e) => {
     console.log('输入每次接受的数据',e)
};
// 每次连接发生错误时调用
evtSource.onerror = function () {
  console.log("连接发生错误");
};

需要注意的是,EventSource是以get方式发送请求,对于post请求原生的EventSource是无法实现的

如何用post的方式进行eventSource请求

常见的是通过@microsoft/fetch-event-source 这个库里的fetchEventSource来实现
import { fetchEventSource } from '@microsoft/fetch-event-source';
这个库封装了一个方法,使得我们可以便捷的通过这个方法直接进行调用
以下是具体的代码


  const [controller, setController] = useState<any>(new AbortController()); 
  const url = 'http:xxx';
    fetchEventSource(url, {
      method: 'POST',
      headers: {
        // SYSTEM_PORTAL_TYPE: 'LINGXI_RUNNING',
        'Content-Type': 'text/event-stream',
        'X-CSRF-TOKEN': '1232123',
        // Cookies: 'ZSMART_LOCALE=zh; ',
      },
      mode: 'cors',
      openWhenHidden: true,
      credentials: 'include',
      signal: controller?.signal,
      onmessage: async (event: any) => {
        console.log('eventeventeventeventeventevent');
        console.log(event);
      },
      one rror(err: any) {
        console.log('err', err);
      },
      async onopen(response: any) {
        if (response.ok) {
          console.log('开始建立连接');
        }
      },
      onclose() {
        console.log('关闭');
        controller?.abort();
        setController(new AbortController());
        throw new Error();
      },
    }).catch((err: any) => {
      controller?.abort();
      setController(new AbortController());
      console.log({ err });
      throw new Error(err);
    });

值得注意的是,在使用fetchEventSource遇到了这么几个问题,分享出来大家踩踩坑

  1. 框架内部代理无法使用。若使用了自身的框架代理(这里我用的是umi),若没做特殊处理并不会走事件流的形式,而是在数据统一接受完成后一次性返回。因此这里我们直接写入http形式的请求地址
  2. 不同源时cookie无法携带。因为使用了http形式而不是代理,这就导致了本机调试时是无法携带cookie到服务端,在一些cookie鉴权的场景会导致鉴权失败。这是浏览器的安全策略,这里我们利用谷歌的插件进行非同源的cookie传送,具体插件百度一下就有

标签:console,log,err,fetchEventSouce,GPT,sse,new,event
From: https://www.cnblogs.com/mishi-blog/p/17746231.html

相关文章

  • 将ChatGPT引入企业财务共享服务的探讨与思考
    以ChatGPT为代表AIGC技术的兴起,引发了新一轮的财务变革热潮,对财务共享服务的影响也是迅速深远的。本文通过从底层技术及服务能力、应用场景、应用挑战等三个维度来探讨与思考如何将ChatGPT引入企业财务共享服务,阐述ChatGPT背后的底层技术为财务共享服务注入语境情感分析能力、数......
  • CHAT GPT人工智能:定义未来通信方式
    CHATGPT人工智能是基于自然语言处理(NLP)技术的一种对话系统,能够模拟人类语言交流,实现与用户的即时通信。该系统采用先进的深度学习算法,通过大量的语言数据训练,使其具备理解、学习和生成自然语言的能力。 随着科技的发展,CHATGPT人工智能将重塑未来通信方式。它可以提供更加智......
  • 人工智能软件CHAT GPT — 创新的交流工具
    人工智能软件CHATGPT是一个基于最新的自然语言处理技术,能够模拟人类的交流方式,通过文本或语音与用户进行互动。它的核心特点是能理解和生成接近自然语言水平的回答,使得交流更加流畅自然。 CHATGPT能够在多个领域应用,如客户服务、教育、娱乐等,通过提供即时的信息回复,节约人......
  • CHAT GPT国内版免费体验:零距离感受智能化便利
    CHATGPT国内版免费体验为用户提供了接触人工智能技术的机会,让用户可以直接体验到智能化带来的便利。该版本通过对话式的界面设计,能够模拟真实人类的交流方式,及时回应用户的提问和指令。不仅如此,它还能够根据用户的喜好和习惯进行学习和优化,提供更加个性化的服务。 无论是日......
  • 文心一言 VS 讯飞星火 VS chatgpt (175)-- 算法导论13.3 4题
    四、用go语言,Teach教授担心RB-INSERT-FIXUP可能将T.nil.color设为RED,这时,当z为根时第1行的测试就不会让循环终止。通过讨论RB-INSERT-FIXUP永远不会将T.nil.color设置为RED,来说明这位教授的担心是没有必要的。文心一言:首先,我们需要明确RB-INSERT-FIXUP的功能和实现方式......
  • nextjs 一键部署ChatGPT 网页版
    ChatGPT的语境理解能力已经得到了大幅提升。它能够更好地理解你输入的问题或指令,并从中获取更多的上下文信息,以便给出更准确和相关的回答。无论是一般性的问题还是特定领域的知识,ChatGPT都能为你提供更有深度的答案Vercel官方打造的ChatGPT网页版代码特色Next.jsAppRouterReact......
  • 软件测试/人工智能/全日制测试开发|利用ChatGPT自动生成自动化测试脚本
    自动化测试是软件测试过程中不可或缺的一部分,它能够提高测试效率,减少测试成本,保障软件质量。然而,编写和维护自动化测试脚本仍然是一个具有挑战性的任务,需要花费大量的时间和精力。学会借助ChatGPT自动生成自动化测试脚本,就可以减少编写自动化脚本的工作量,提高测试效率。如何借助Cha......
  • 2023 年精选:ChatGPT 会取代开发者吗?
    由于最近发布了ChatGPT,人工智能再次热闹起来,ChatGPT是一种自然语言聊天机器人,人们用它来写电子邮件、诗歌、歌词和大学论文。早期采用者甚至用它来编写Python代码,以及对shellcode进行逆向工程并用C重写。ChatGPT给那些渴望人工智能实际应用到来的人们带来了希望,但它也引出了......
  • wasmex webassenbly elixir 运行时
    wasmex是基于wasmtime以及rustnif开发的方便elixir运行webassembly的框架与rust的集成与rust集成使用的三方包 与mjml工具类似使用了rustler_precompiled以及rustlerrust使用的三方包 前边也说了是基于了wasmtime包装的,同时使用了wasmtimewasi一些子模块说明rustle......
  • 文心一言 VS 讯飞星火 VS chatgpt (174)-- 算法导论13.3 3题
    三、用go语言,假设图13-5和图13-6中子α、β、γ、δ和ε的黑高都是k。给每张图中的每个结点标上黑高,以验证图中所示的转换能保持性质5。文心一言:在Go语言中,你可以通过以下步骤来为图13-5和图13-6中的每个节点分配黑高,以验证性质5。首先,我们需要定义一个结构体来表示图中的节点,然......