【JavaScript】fetch 处理流式数据,实现类 chatgpt 对话

20行JavaScript实现ChatGPT式流式对话(纯前端) 流式响应是构建类ChatGPT交互体验的核心技术基础,其本质是客户端通过SSE或Fetch Stream实时接收服务端分块数据,并逐帧渲染以模拟‘打字机效果’。该技术绕过传统同步请求瓶颈,依赖ReadableStream、AbortController和requestIdleCallback等现代Web API保障低延迟与高帧率。在轻量级AI集成、MVP快速验证及静态站点嵌入等场景中,纯JavaScript流式渲染方案具备零部署、免后端、强兼容等工程优势。本文聚焦真实可用的20行核心代码,详解如何用原生JS 阅读详情

本文只包含最基础的请求后端大佬给得对话接口,大部分模型的传参是差不多的,核心还是如何处理 fetch 获取的流数据

import { defineStore } from 'pinia';
import { ElMessage } from 'element-plus';

type Role = 'system' | 'user' | 'assistant';
export interface Message {
  role: Role;
  content: string;
}
interface ChatStore {
  model: 'Gnosis' | 'chatglm2-6b' | 'cc-13b-chat';
  chatApi: string;
  messages: Message[];
  done: boolean | null;
}
const DEFAULT_PROMPT = `你应该根据用户回答生成答案。答案必须尽可能简明扼要。字数控制在512个字符以内`;

export const useChatStore = defineStore({
  id: 'chatStore',
  state: (): ChatStore => {
    return {
      model: 'cc-13b-chat',
      chatApi: 'chat_api/chat/knowledge_base_chat',
      messages: [
        {
          role: 'system',
          content: DEFAULT_PROMPT,
        },
      ],
      done: null,
    };
  },
  actions: {
    async fetchChat(query: string) {
      this.messages.push({
        role: 'user',
        content: query,
      });
      let response: any = null;
      try {
        response = await fetch(this.chatApi, {
          headers: {
            'Content-Type': 'application/json',
          },
          method: 'POST',
          body: JSON.stringify({
            query: query,
            history: this.messages,
            model_name: this.model,
            stream: true,
            knowledge_base_name: 'lb_test',
            top_k: 1,
            score_threshold: 1,
            temperature: 0.7,
            max_tokens: 4096,
            prompt_name: 'default',
          }),
        });
      } catch (error) {
        console.log(error);
        ElMessage.error('请求失败');
        return;
      }
      const data = response.body;
      this.messages.push({
        role: 'assistant',
        content: '',
      });
      // 处理流式数据
      if (data) {
        const reader = data.getReader();
        const decoder = new TextDecoder('utf-8');
        this.done = false;
        while (!this.done) {
          const { value, done: readerDone } = await reader.read();
          // value值
          // {"answer": "帮助解决"}
          if (value) {
            const char = decoder.decode(value);
            console.log(char);
            // if (char === '\n') {
            //   this.messages[this.messages.length - 1].content += '\n';
            //   continue;
            // }
            if (char) {
              const res = JSON.parse(char);
              this.messages[this.messages.length - 1].content += res.answer ?? '';
            }
          }
          if (!this.done) {
            this.done = readerDone;
          }
        }
      }
      // 对话结束
      this.done = null;
    },
  },
  // persist: {
  //   key: 'store',
  //   storage: window.localStorage,
  // },
});

20行JavaScript实现流式AI对话界面:纯前端ChatGPT类机器人 流式响应(streaming)是现代大模型前端集成的核心能力,其本质是基于Fetch API的ReadableStream接口对SSE(Server-Sent Events)数据进行分块读取与实时渲染。相比传统XMLHttpRequest,它能精准处理UTF-8多字节字符边界,避免中文、emoji乱码,保障对话体验的完整性与实时性。该技术不依赖后端框架,适用于快速验证API兼容性、构建轻量级交互原型及教学演示等场景。结合TextDecoder流式解码、DOM增量更新与message上下文管理,开发者可在纯浏 阅读详情

相关推荐

实现chatGpt中的数据依次展示效果(Fetch+nodeJs)

流式数据获取并展示的前后端实现

willwe的博客 1500

Fetch处理大模型流式数据请求与解析

为什么有的大模型可以一次返回多个data?:允许服务器连续发送多个 data: 行,每个代表一个独立的数据块。:大模型服务通常以流式响应方式返回数据,提高响应速度。:服务器可能将多个数据块打包发送,减少网络开销。

不负光阴不负自己,不负被爱不负所爱 ​ 1909

手把手教你用CANopen SDO报文控制步进电机(附CIA402协议详解)

本文详细解析了如何通过CANopen SDO报文控制步进电机,深入讲解CIA402协议的核心架构、状态机模型及对象字典管理,并提供实战代码示例。从SDO报文构造到多轴同步控制,帮助开发者掌握工业级步进电机的精确控制技术,适用于自动化设备开发。

weixin_33737774的博客 485

前端fetch 实现流式接口

先说说传统传输吧,我们日常接触的大多数是传统传输方式,就也是整段传输,前后端将数据一次性传送给对方;相比于传统传输方式,流式传输则采用分段的方式将要传输的数据分层n段,后端一次性传一段给前端,直到传输完成为止,当然在传输的过程中,前端也可以提前中断传输,后端收到中断传输的消息后,也不再继续往前端传输剩下没传完的数据段。当然,前端流式传输需要在后端支持分块传输的情况下才能实现。简单来说fetch 是一种 HTTP 数据请求的方式, XMLHttpRequest(以下简称 XHR)的一种替代方案。

weixin_44405693的博客 7377

HCIA重点知识

华为认证ICT工程师,是华为认证体系中用于标识个人能力在某一技术领域达到工程师级别的证明,表示通过认证的人员具备安装、配置、运行 ICT 设备,并进行基础故障排除的能力。抽象语言 -----> 编码 -----> 二进制 -----> 电信号 -----> 处理电信号信号的转换标准:协议,是一种允许电子设备相互交流的一系列标准的规则。即开放系统参考模型OSI/RM,简称“OSI”。OSI参考模型将计算机网络分为七个层次,自上而下依次为:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。1、应用层:

Awen0201的博客 2539

基于粒子群算法的PID控制器优化设计

粒子群算法、PID、寻优

qq_46107700的博客 2万+

fetch 获取流式数据(chatgpt的流式输出)

fetch 获取流失数据,并实时展示在页面(chatgpt的流式输出) 好处:流式获取一般在用于数据量比较大的情况,一次性返回会导致前端页面加载时间过长或者请求超时等问题,这时候我们就可以考虑使用流式的方式拿到部分数据并先展示,从而提升用户体验。使用场景:在对接chatgpt 语言模型的时候采取的这种方案,因为目前的大语言的模型的结果都是需要一点点计算的,如果提出的问题比较复杂就导致响应的时间过长。背景:项目中需要获取chatgpt实时返回的数据。

weixin_38822843的博客 4018

多目标优化NSGA-II(快速精英非支配排序遗传算法)及python实现

文章目录前言一、什么是NSGA-II?二、学习NSGA-II1.快速非支配排序算法2.密度估计3.拥挤比较算子4.主循环5.代码6.总结 前言 NSGA-II适用于复杂的多目标优化问题,是K-Deb教授在2000年在一篇paper《MOEAs — A fast and elitist multi-objective genetic algorithm: nsga2》提出。 Keywords: optimization; multi-objective evolutionary algorithm; no

ricky_blog 9744

fetch接收流式数据

【代码】fetch接收流式数据。

qq_57226103的博客 798

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

KE17RS的博客 2875

【新能源汽车测试工程师必看!DBC文件50条实战技巧,看懂这篇直接封神】

如果你是新能源汽车研发/测试工程师,还在为信号解析错误、报文找不到、DBC看不懂、实车故障复现不了头疼——那这篇文章,你一定要!在整车电控开发里,DBC = CAN总线的官方字典。没有DBC,报文就是一串乱码;读不懂DBC,测试寸步难行;用不好DBC,排查故障全靠猜。本文总结50条全网最实用、最贴近实车、最能解决问题的DBC技巧,从基础语法到新能源专用信号,从工具操作到故障排错,全部来自一线台架、实车、高压平台实战经验。不废话、不空谈、不玄学,全是能直接落地的硬货!

优快云-新能源汽车研发测试专业博主 1367

使用fetch流式获取响应数据

流式获取一般在用于数据量比较大的情况,一次性返回会导致前端页面加载时间过长或者请求超时等问题,这时候我们就可以考虑使用流式的方式拿到部分数据并先展示,从而提升用户体验。我这里的场景是在对接chatGPT语言模型的时候采取的这种方案,因为目前的大语言的模型的结果都是需要一点点计算的,如果提出的问题比较复杂就导致响应的时间过长。

学而不思则罔 5408

字符串尾部空格的迷思:深入解析 ABAP 隐式转换规则与 `strlen` 意外结果

看似简单的strlen之谜,背后实则是 ABAP 隐式转换的一整套严谨规则。只要开发者在赋值、输出、接口映射等关键节点建立“尾部空格意识”,辅以CONVCONDENSE等显式手段,就能有效杜绝多余空格引发的链式故障。希望本文的拆解与案例,能让你在面对下一个“异常长度”时,从容而笃定地给出正确答案。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 430

JS实现chatgpt数据流式回复效果

处理下,然后代码片段着色利用。

一只路过的小码农 2373

HBase在物流行业的应用:轨迹数据存储

想象一下,每天在全球范围内,数以亿计的物流包裹在各个城市、乡镇间穿梭。每一个包裹从发货人手中出发,经过仓储中心、转运站,最终到达收货人手中,这一路上都留下了它的“足迹”,也就是我们所说的轨迹数据。这些数据就像一个个拼图碎片,完整拼接起来后,能够清晰地呈现出整个物流网络的运行状况。例如,你在网上购买了一件心仪已久的商品,迫不及待地想知道它现在到哪儿了。物流平台实时更新的轨迹信息,让你可以准确了解包裹是在运输途中,还是已经到达附近的站点。

架构师的AI之路,分享AI应用开发架构的学习与实践。 965

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

18行JavaScript实现ChatGPT式流式对话引擎

对话系统本质是状态管理与消息流编排的结合体,其核心原理在于维护会话上下文、控制请求生命周期、实现渐进式响应渲染。技术价值体现在轻量、可控、可调试——无需框架依赖即可获得毫秒级视觉反馈与完整错误可观测性。典型应用场景包括内部工具快速原型、教育类互动面板、客服插件及资源受限终端(如IoT控制台)。本文聚焦纯前端状态机设计,深入解析流式SSE响应解析、内存级上下文管理、XSS安全渲染等关键实践,覆盖从零搭建到生产部署的全链路细节。

weixin_30776545的博客 392

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

开发chatgpt 之 SSE(Server-Sent Events) 发送POST请求 fetch的实现

之前写过一篇使用 SSE(Server-Sent Events)发送GET请求接受chatgpt Stream数据的文章:从零开始开发自己的chatgpt平台 之 SSE(Server-Sent Events)客户端和服务端在文章最后留了一个问题 SSE是通过get参数发送消息的,但是get是有限制的,因此这个方法并不好,那如何像openai一样让SSE发送POST 请求呢?本文讲解如何使用fetch实现。

asplh的专栏 4686

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

fetch 请求流式chunk 处理数据

摘要 本文介绍了一种基于Node.js的流式数据渲染方案,模拟ChatGPT的流式请求模式。通过不设置Content-Length头,服务器自动启用chunked transfer编码,实现边计算边传输数据的效果。文章提供了Node服务端代码示例,每100ms推送10条矩形框数据,以及前端使用fetch API处理流式响应的完整实现方案。重点解析了如何将二进制流转换为结构化数据的过程,并比较了fetch与XHR的优劣,以及chunked传输与Server-Sent Events的区别。方案适用于需要实时渲染

阿牛哥的博客 1210

实现简单的ChatGPT官网的对话效果

方法我认为会读取当前http响应报文请求体的内容,一个请求报文可以有多个响应报文,该方法会返回一个带有done和value属性的对象,分别对应是否完成和字节流,并且我注意到响应头多了一个。对象的reader,即获取读指针,然后创建一个document对象自带的解码器。服务端代码,采用http和fs库原生实现。请求请求nodejs接口,异步等待。,解码器用来将解码二进制的字节流,

printfscanfmain的博客 612

chatGPT流式输出前端实现fetch、SSE、websocket

在 SSE 中,浏览器通过发送 HTTP GET 请求到服务器上特定的 SSE 端点(endpoint),然后服务器通过该连接发送事件(event)和相关数据到客户端,故SSE 主要使用 GET 请求。fetch 本身不直接支持流式输出,但你可以使用 ReadableStream 和 TextDecoder 等 Web Streams API 来实现类似的效果。WebSocket 是一种全双工通信协议,允许客户端和服务器之间进行实时的双向通信,并且支持POST请求。:进入src文件下载所需。

qq_48434912的博客 6900

20行JavaScript实现ChatGPT-like流式对话界面

ChatGPT-like对话界面指具备流式逐字输出、上下文记忆与用户中断重试能力的前端交互范式。其核心原理是利用fetch API的ReadableStream直接消费SSE(Server-Sent Events)数据流,结合TextDecoder实时解码并增量渲染,避免全量响应阻塞首字延迟。该方案剥离模型推理责任,专注前端可确定性逻辑,显著降低原型验证门槛,技术价值在于以最小代码覆盖真实产品级交互契约。典型应用场景包括AI产品快速Demo、IoT设备本地控制面板、教育类编程教学沙盒等。本文基于JavaSc

weixin_29722783的博客 382

Vue3实现chatgpt的流式输出

Vue3实现chatgpt的stream流式输出

weixin_68714627的博客 2万+

手写chatGPT——fetch解析text/event-stream会话流并逐字回显到页面——js技能提升

手写chatGPT——fetch解析text/event-stream会话流并逐字回显到页面——js技能提升

yehaocheng520的博客 1680

chatGpt fetch stream解析

【代码】chatGpt fetch stream解析。

qq_38902432的博客 296

【人工智能】揭秘 ChatGPT 的“打字机”流逝返回背后技术 —— 深度解析 SSE 与 Fetch 实现

随着人工智能技术的快速发展,智能聊天机器人如 ChatGPT 已成为人们日常生活和工作中的得力助手。作为用户体验的关键部分,ChatGPT 的“打字机”式回复不仅增加了互动的真实感,还提升了用户的参与感和满意度。那么,这种逐字呈现的效果是如何实现的呢?本文将带你深入解析 ChatGPT 消息回复的实现原理,重点介绍 Server-Sent Events (SSE) 技术,并对比传统的 WebSockets 以及 modern 的 Fetch API 的应用场景和优势。

万物皆有灵 755

前端接收流式数据demo,并用markdown解析数据,包括EventSource和fetch两种方式

前端接收流式数据demo,并用markdown解析数据,包括EventSource和fetch两种方式

qq_41822157的博客 1041
上一篇: 【Element】去除 el-dropdown 暗黑模式下的下划线
下一篇: 【Nuxt】Nuxt3 响应式方案:rem、vw
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值