Uniapp仿ChatGPT Stream流式输出(非Websocket)

Uniapp仿ChatGPT Stream流式输出(非Websocket)

前言:流式输出可以使用websocket也可以使用stream来实现EventSource是 HTML5 中的一个接口,用于接收服务器发送的事件流(Server - Sent Events,SSE)。它提供了一种从服务器单向推送实时数据到 Web 页面的方式,使得 Web 应用能够以类似于事件驱动的模式获取更新,而不需要通过传统的轮询方式(不断地向服务器询问是否有新数据)。

请求和接收

  1. 使用代码
data (){return {task:null,msg:"" ,dataList:[], // 聊天内容}
},
methods:{askAgain() {if (this.msg) {this.$util.showToast(`请输入您的问题`)return}this.$refs.paging.scrollToBottom()setTimeout(() => {if (!item) {this.dataList.unshift({content: msg, // 消息内容type: 1, // 此为消息类别,设 1 为发出去的消息,0 为收到对方的消息,end: true,name: 'me',list: [],id: new Date().getTime()})}this.dataList.unshift({content: '', // 消息内容content1: '', // 消息内容type: 0, // 此为消息类别,设 1 为发出去的消息,0 为收到对方的消息,end: false,name: 'ai',id: new Date().getTime()})this.toSend(msg);this.$refs.paging.scrollToBottom()}, 300)},toSend(msg) {const that = this;this.task = uni.request({url: `${ getApp().globalData.requestUrl }ai/app/escort/ai/chat?question=${msg}`, // 会话接口enableChunked: true, // 这意味着服务器会采用分块传输编码来发送数据。method: 'POST',timeout: 900000, // 设置超时时间为10秒data: {"question": msg, // 问题"userId": uni.getStorageSync('wxopenid'), // 此处参数更具自己的参数填写},success: (res) => {console.log(res)if (res.statusCode == 200) {// 本次回话是否完成}},fail: () => {}})// 监听流推送this.task.onChunkReceived((res) => {let uint8Array = new Uint8Array(res.data),txt;const type = Object.prototype.toString.call(uint8Array);if (type === "[object Uint8Array]") {txt = decodeURIComponent(escape(String.fromCharCode(...uint8Array)));} else if (uint8Array instanceof ArrayBuffer) {// 将ArrayBuffer转换为Uint8Array	const arr = new Uint8Array(uint8Array);txt = decodeURIComponent(escape(String.fromCharCode(...arr)));}console.log(txt)// 此处是我的逻辑  我推送的数据用^分割  所以要截取。txt.split('^').forEach(it => {if (it) {let res = JSON.parse(it)console.log(res)that.dataList[0].content1 += res.data}})});},
}
  1. 以上为对话请求 和 流响应接收逻辑。

框架使用 z-paging

  1. 插件地址 z-paging
  2. 我的框架使用 z-paging 插件
    在这里插入图片描述

文本回显 普通文本

<view class="text-warp">{{ item.content }}
</view>

含有标签结构的文本回显 如img video 等

  1. 插件地址 zero-markdown-view
<zero-markdown-view :markdown="item.content"></zero-markdown-view>

流推送标签 会导致页面回显出标签 标签推送完才能展示出图片或视频

  1. 解决方法 声明新的变量接收 字符
  2. 遍历字符 当流中出现<img 字符开始截取 然后插入loading图片
  3. 当 图片标签尾部 /> 出现后 用截取的图片 替换掉 loading图片
  4. 以上为处理方法 , 可以解决zero-markdown-view 组件回显 带图片,标签的流数据时 闪烁的问题,以及标签的暴漏问题

流推送 字符长短不一,实现打字效果

  1. 每次推送调用递归方法 取一个字符
	addNextCharacter() {if (this.index < this.newVal.length) { this.messages[0].content += this.newVal[this.index];this.index++; this.character = setTimeout(()=>{this.addNextCharacter()},Math.random() * 150 + 30)}else{clearTimeout(this.character)this.character = nullif(!this.stratSet){// 此处在请求完成后 清空所有的数据}}},

以上为开发中聊天功能 问题整理。代码有点乱,暂不付代码。有问题还请私信。 代码地址https://gitee.com/xyx904/ai/tree/master/artShow

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

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

相关文章

《自动驾驶与机器人中的SLAM技术》ch2:基础数学知识

目录 2.1 几何学 向量的内积和外积 旋转矩阵 旋转向量 四元数 李群和李代数 SO(3)上的 BCH 线性近似式 2.2 运动学 李群视角下的运动学 SO(3) t 上的运动学 线速度和加速度 扰动模型和雅可比矩阵 典型算例&#xff1a;对向量进行旋转 典型算例&#xff1a;旋转的复合 2.3 …

深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比

众所周知&#xff0c;不管是什么框架&#xff0c;在前端 UI 渲染时&#xff0c;都会有构造出一套相关的渲染树&#xff0c;并且在 UI 更新时&#xff0c;为了尽可能提高性能&#xff0c;一般都只会进行「差异化」更新&#xff0c;而不是对整个 UI Tree 进行刷新&#xff0c;所以…

Elasticsearch—索引库操作(增删查改)

Elasticsearch中Index就相当于MySQL中的数据库表 Mapping映射就类似表的结构。 因此我们想要向Elasticsearch中存储数据,必须先创建Index和Mapping 1. Mapping映射属性 Mapping是对索引库中文档的约束&#xff0c;常见的Mapping属性包括&#xff1a; type&#xff1a;字段数据类…

occ的开发框架

occ的开发框架 1.Introduction This manual explains how to use the Open CASCADE Application Framework (OCAF). It provides basic documentation on using OCAF. 2.Purpose of OCAF OCAF (the Open CASCADE Application Framework) is an easy-to-use platform for ra…

esp32在编译是报错在idf中有该文件,但是说没有

报错没有头文件esp_efuse_table.h D:/Espressif/frameworks/esp-idf-v5.3.1/components/driver/deprecated/driver/i2s.h:27:2: warning: #warning "This set of I2S APIs has been deprecated, please include driver/i2s_std.h, driver/i2s_pdm.h or driver/i2s_tdm.h …

git - 用SSH方式迁出远端git库

文章目录 git - 用SSH方式迁出远端git库概述笔记以gitee为例产生RSA密钥对 备注githubEND git - 用SSH方式迁出远端git库 概述 最近一段时间&#xff0c;在网络没问题的情况下&#xff0c;用git方式直接迁出git库总是会失败。 失败都是在远端, 显示RPC错误。 但是git服务器端…

http和https有哪些不同

http和https有哪些不同 1.数据传输的安全性&#xff1a;http非加密&#xff0c;https加密 2.端口号&#xff1a;http默认80端口&#xff0c;https默认443端口 3.性能&#xff1a;http基于tcp三次握手建立连接&#xff0c;https在tcp三次握手后还有TLS协议的四次握手确认加密…

超详细-java-uniapp小程序-引导关注公众号、判断用户是否关注公众号

目录 1、前期准备 公众号和小程序相互关联 准备公众号文章 注册公众号测试号 微信静默授权的独立html 文件 2&#xff1a; 小程序代码 webview页面代码 小程序首页代码 3&#xff1a;后端代码 1&#xff1a;增加公众号配置项 2&#xff1a;读取公众号配置项 3&…

【Python进阶——分布式计算框架pyspark】

Apache Spark是用于大规模数据处理的统一分析引擎 简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群&#xff0c;计算TB、PB乃至EB级别的海量数据&#xff0c;Spark作为全球顶级的分布式计算框架&#xff0c;支持众多的编程语言进行开…

基于 FastExcel 与消息队列高效生成及导入机构用户数据

&#x1f3af; 本文档详细介绍了开发机构用户数据导入功能的必要性及实现方法&#xff0c;如针对教育机构如学校场景下提高用户体验和管理效率的需求。文中首先分析了直接对接学生管理系统与平台对接的优势&#xff0c;包括减少人工审核成本、提高身份验证准确性等。接着介绍了…

校园跑腿小程序---轮播图,导航栏开发

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

前端练习题

图片&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>用户信息页面</title><style>body {font-family: Arial, sans-serif;margin: 20px;}.user-info {display: flex;align-it…

AllData是怎么样的一款数据中台产品?

&#x1f525;&#x1f525; AllData大数据产品是可定义数据中台&#xff0c;以数据平台为底座&#xff0c;以数据中台为桥梁&#xff0c;以机器学习平台为中层框架&#xff0c;以大模型应用为上游产品&#xff0c;提供全链路数字化解决方案。 ✨奥零数据科技官网&#xff1a;…

一学就废|Python基础碎片,OS模块

Python 中的操作系统模块提供了与操作系统交互的功能。操作系统属于 Python 的标准实用程序模块。该模块提供了一种使用依赖于操作系统的功能的可移植方式。os和os. path模块包括许多与文件系统交互的函数。 Python-OS 模块函数 我们将讨论 Python os 模块的一些重要功能&…

2.Numpy练习(1)

一.练习一&#xff1a; 1.打印当前numpy版本&#xff1a; 2.构造一个全零的矩阵&#xff0c;并打印其占用内存大小&#xff1a; 3.打印一个函数的帮助文档&#xff0c;比如numpy.add&#xff1a; 4.创建一个10~49数组&#xff0c;并将其倒序排列: 5.找到一个数组中不为0的索引…

Ubuntu Server挂载AWS S3成一个本地文件夹

2023年&#xff0c;AWS出了个mountpoint的工具&#xff1a; https://github.com/awslabs/mountpoint-s3 如下是另外一种方式&#xff0c;通过s3fs-fuse 这个工具 sudo apt-get install automake autotools-dev \fuse g git libcurl4-gnutls-dev libfuse-dev \libssl-dev libx…

CSS3的aria-hidden学习

前言 aria-hidden 属性可用于隐藏非交互内容&#xff0c;使其在无障碍 API 中不可见。即当aria-hidden"true" 添加到一个元素会将该元素及其所有子元素从无障碍树中移除&#xff0c;这可以通过隐藏来改善辅助技术用户的体验&#xff1a; 纯装饰性内容&#xff0c;如…

nvm use使用nodejs版本时报错

文章目录 报错原因分析解决方法 报错 nvm use报错出现乱码&#xff1a; 比如nvm use 22.12.0&#xff0c;出现下面报错&#xff1a; exit status 1: ‘D:\Program’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&…

C++中线程同步与互斥的4种方式介绍、对比、场景举例

在C中&#xff0c;当两个或更多的线程需要访问共享数据时&#xff0c;就会出现线程安全问题。这是因为&#xff0c;如果没有适当的同步机制&#xff0c;一个线程可能在另一个线程还没有完成对数据的修改就开始访问数据&#xff0c;这将导致数据的不一致性和程序的不可预测性。为…

1、docker概念和基本使用命令

docker概念 微服务&#xff1a;不再是以完整的物理机为基础的服务软件&#xff0c;而是借助于宿主机的性能。以小量的形式&#xff0c;单独部署的应用。 docker&#xff1a;是一个开源的应用容器引擎&#xff0c;基于go语言开发的&#xff0c;使用时apache2.0的协议。docker是…