当前位置: 首页 > news >正文

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

本文只包含最基础的请求后端大佬给得对话接口,大部分模型的传参是差不多的,核心还是如何处理 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,// },
});
http://www.lryc.cn/news/235473.html

相关文章:

  • 收发电子邮件
  • sql13(Leetcode570至少有5名直接下属的经理)
  • 15分钟,不,用模板做数据可视化只需5分钟
  • C 语言字符串函数
  • nvm安装详细教程(卸载旧的nodejs,安装nvm、node、npm、cnpm、yarn及环境变量配置)
  • 详细步骤记录:持续集成Jenkins自动化部署一个Maven项目
  • Python学习(一)基础语法
  • 【C刷题】day7
  • 数据挖掘复盘——apriori
  • Windows10下Maven3.9.5安装教程
  • 【开源】基于JAVA的校园失物招领管理系统
  • requests爬虫IP连接初始化问题及解决方案
  • Argo Rollouts结合Service进行Blue-Green部署
  • mongodb——原理简介,docker单机部署
  • ThinkPHP 系列漏洞
  • 系列十、你说你做过JVM调优和参数配置,请问如何盘点JVM系统的默认值?
  • Java Web——Web开发介绍
  • Vue 数据监听机制及 Vue 2.0 和 Vue 3.0 的比较
  • QT多线程项目中子线程无法修改主线程的ui组件
  • Python 如何实现备忘录设计模式?什么是备忘录设计模式?Python 备忘录设计模式示例代码
  • LangChain 代理 Agent(学习笔记)
  • 实验三 页面置换算法
  • Node.js中的Buffer和Stream
  • 3.5 Windows驱动开发:应用层与内核层内存映射
  • 【小黑送书—第八期】>>别再吐槽大学教材了,来看看这些网友强推的数学神作!
  • MatLab的下载、安装与使用(亲测有效)
  • 无人智能货柜:引领便捷购物新体验
  • 4.6 Windows驱动开发:内核遍历进程VAD结构体
  • 基于世界杯算法优化概率神经网络PNN的分类预测 - 附代码
  • NPM 与 XUI 共存!Nginx Proxy Manager 搭配 X-UI 实现 Vless+WS+TLS 教程!