ChatGpt 使用fetch-event-source实现sse流式处理

@microsoft/fetch-event-source 是一个由微软提供的库,用于在客户端和服务器之间建立基于 EventSource 的连接。EventSource 是一种 HTTP 协议,允许服务器向客户端推送实时事件流。该库提供了对 EventSource 协议的封装,使得在前端 JavaScript 中使用 EventSource 变得更加方便。

在 @microsoft/fetch-event-source 中,主要使用 fetchEventSource 函数来创建一个新的 EventSource 连接。这个函数接受一个 URL 参数,以及一个配置对象,其中可以包含一些选项,如请求方法、请求头、请求体等。当服务器向客户端推送事件时,可以通过 onmessage 回调函数来处理这些事件。此外,还可以提供 onerror 和 onclose 回调函数来处理连接错误和关闭事件

一、安装
pnpm install @microsoft/fetch-event-source
二、使用

 前端vue3:

import { fetchEventSource } from '@microsoft/fetch-event-source'class RetriableError extends Error {}
class FatalError extends Error {}const EventStreamContentType = 'text/event-stream; charset=utf-8'export const fetchEventGpt = (data: any, callData: (arg0: any) => void) => {const ctrl = new AbortController()fetchEventSource('/api/stream', {method: 'POST',mode: 'no-cors',headers: {'Content-Type': 'application/json',},body: JSON.stringify(data),signal: ctrl.signal,openWhenHidden: true,async onopen(response: any) {// 成功连接时回调if (response.ok && response.headers.get('content-type') === EventStreamContentType) {return // everything's good} else if (response.status >= 400 && response.status < 500 && response.status !== 429) {// client-side errors are usually non-retriable:throw new FatalError()} else {throw new RetriableError()}},onmessage(msg: { data: any; event: string }) {// 服务器返回消息回调 返回{ data,event,id,retry } ,data即服务器返回数据// if the server emits an error message, throw an exception// so it gets handled by the onerror callback below:if (msg.event === 'FatalError') {throw new FatalError(msg.data)}if (msg.event == '') {// 进行连接正常的操作try {const data = JSON.parse(msg.data)?? {}const {finish, code } = data??{}callData(data)if(code*1 === 200 && finish) {ctrl.abort()}} catch (err) {console.log(err)throw err}}if (msg.event === 'close') {ctrl.abort()}},onclose() {// 正常结束的回调ctrl?.abort()throw new RetriableError()},onerror(err: any) {// 连接出现异常回调// 必须抛出错误才会停止ctrl?.abort()if (err instanceof FatalError) {throw err // rethrow to stop the operation} else {// do nothing to automatically retry. You can also// return a specific retry interval here.}},})
}

 服务端python:

from gevent import monkeymonkey.patch_all()import timefrom flask import Response, stream_with_context
from flask import Flask
from gevent.pywsgi import WSGIServer
from flask import requestapp = Flask(__name__)def predict():chatbot = [""]mid = """一、引言\n1. 背景介绍\n2. 研究意义\n\n二、多旋翼无人机概述\n1. 多旋翼无人机的定义\n2. 多旋翼无人机的特点\n3. 多旋翼无人机的基本结构\n\n三、多旋翼无人机控制方法\n1. 手动控制\n2. 遥控控制\n3. 自主控制\n\n四、多旋翼无人机调度方法\n1. 手动调度\n2. 遥控调度\n3. 自主调度\n\n五、多旋翼无人机应用实例\n1. 农业领域\n2. 航拍领域\n3. 搜索救援\n4. 其他应用领域\n\n六、多旋翼无人机的安全问题\n1. 飞行安全隐患\n2. 数据隐私问题\n3. 人机交互问题\n\n七、结论\n1. 研究总结\n2. 研究局限\n3. 研究展望"""s = ""for response in mid:s += responseyield [s], []@app.route("/api/stream", methods=["GET", "POST"])
def progress():@stream_with_contextdef generate():ratio = 1data_stream = predict()for data in data_stream:yield str("data:") + str(data) + "\n\n"print("ratio:", ratio)time.sleep(0.1)headers = {"Content-Type": "text/event-stream","Cache-Control": "no-cache","X-Accel-Buffering": "no","Access-Control-Allow-Origin": "*","Access-Control-Allow-Methods": "GET,POST","Access-Control-Allow-Headers": "x-requested-with,content-type",}return Response(generate(), mimetype="text/event-stream", headers=headers)if __name__ == "__main__":http_server = WSGIServer(("0.0.0.0", int(8081)), app)http_server.serve_forever()

        我们创建了一个指向 http://192.168.4.164:8081/gptchat/gpt 的 EventSource 连接,使用 POST 方法发送 JSON 格式的请求体数据。当接收到服务器推送的事件时,会打印事件数据。如果发生错误或连接关闭,也会打印相应的信息。

        需要注意的是,虽然 EventSource 本身不支持 POST 方法,但通过使用 fetchEventSource 函数和适当的配置,我们可以模拟 POST 请求的效果。在服务器端,需要正确处理这种 POST 请求,并返回正确格式的事件流数据。

        此外,由于 EventSource 是基于 HTTP 的协议,因此它只能在支持 HTTP 的环境中使用,如浏览器端或 Node.js 服务器端。同时,由于它是基于长连接的协议,因此在使用过程中需要注意连接的管理和错误处理。

三、遇到问题

   1、跨域问题

 设置mode: "no-cors" 解决跨域问题,但是返回的body信息为null

在vite.config.ts配置代理

  devServer: {port: 8089,proxy: {"/api": {target: "http://192.168.4.164:8081",changeOrigin: true,}},

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/502515.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

旧衣回收小程序开发,提高回收效率增加创收

在我国经济大力发展下&#xff0c;国人的生活水平不断提高。生活质量得到提升&#xff0c;衣食住行也从而得到了提升。因此&#xff0c;家家户户中产生的闲置衣物开始增加&#xff0c;我国旧衣回收市场规模非常庞大。 当下&#xff0c;时代发展主流是以互联网为主&#xff0c;…

项目-SERVER模块-Socket模块

Socket模块 一、Socket模块是什么&#xff1f;二、代码实现1.成员变量2.构造、析构函数3.获取套接字文件描述符4.创建套接字5.绑定地址信息6.开始监听连接请求7.向服务器发起连接8.获取新连接9.接收数据10.非阻塞接收数据11.发送数据12.非阻塞发送数据13.关闭套接字14.创建一个…

神经网络系列---卷积

文章目录 卷积神经网络卷积转置卷积 卷积核和反卷积的三种实现方式卷积的次数计算 卷积神经网络 在神经网络的卷积层中&#xff0c;向下取整&#xff08;Floor&#xff09;是一种常用的策略&#xff0c;特别是在处理输出尺寸不是整数的情况时。当你计算出卷积层输出的尺寸&…

深入了解接口测试:方法、工具和关键考虑因素

接口测试是软件测试中的一项重要工作&#xff0c;它涉及到系统与系统之间的交互点。接口可以是外部接口&#xff0c;也可以是内部接口&#xff0c;包括上层服务与下层服务接口以及同级接口。在接口测试中&#xff0c;我们需要确保接口能够按照预期的方式进行通信和交互&#xf…

二叉树(Java)

目录 一、概念二、 两种特殊的二叉树三、 二叉树的性质四、二叉树的存储五、二叉树的基本操作1、二叉树的遍历&#xff08;1&#xff09;前中后序遍历&#xff08;2&#xff09;层序遍历 2、基本操作 六、总结 一、概念 一棵二叉树是结点的一个有限集合&#xff0c;该集合&…

xsslabs第六关

看一下源码 <!DOCTYPE html><!--STATUS OK--><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <script> window.alert function() { confirm("完成的不错&#xff01;…

驱动高级--mknod

一、起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a; 热插拔 不支持一些针对所有设备的统一操作&#xff08;如电源管理&#xff09; 不能自动mknod 用户查看不了设备信息 设备信息硬编码&#xff0c;导致驱动代码通用性差&#xff0c;即没有分离…

JavaScript DOM操作笔记记录回忆总结

一、什么是DOM&#xff1f; 1、通过 HTML DOM&#xff0c;可访问 JavaScript HTML 文档的所有元素。 2、当网页被加载时&#xff0c;浏览器会创建页面的文档对象模型&#xff08;Document Object Model&#xff09; 二、操作DOM 1、在操作DOM之前&#xff0c;我们需要先获取到…

vue自定义实现icon选择器

<template> <div> <span class"iconStyle" click"selectIcon"> <i :class"value" /> </span> <div class"iconTitle">选择图标</div> <el-dialog title"" :visible.sync"…

bvh文件,人体骨骼重定向

关于两个bvh文件&#xff0c;人体骨骼重定向&#xff0c;小白记录 1、打开 Motionbuilder &#xff0c;选择 打开特定路径下的bvh文件。 绑定骨骼&#xff08;在绑定骨骼过程中&#xff0c;如果骨骼角度&#xff0c;大小之类的不方便&#xff0c;可以shift键加鼠标拖拽界面&…

vulhub中Aapache Tomcat AJP 文件包含漏洞复现(CVE-2020-1938)

查看tomcat默认页面&#xff0c;此时通过AJP协议的8009端口亦可访问Tomcat。 利用如下工具均可测试漏洞&#xff1a; https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi 工具需要用到python2&#xff0c; 如果需要进一步利用需要向服务器的/webapps/ROOT目录下上传…

Entry First Day 入职恩孚第一天

入职第一天&#xff0c;电脑还没配置好就去了工厂。 熟悉了一下设备&#xff0c;切了几个小玩意&#xff0c; hello world 一下。 了解了串行端口的Nodejs的库 https://github.com/serialport/node-serialport&#xff0c;以后要用这个东西和硬件通讯&#xff0c;安装&#…