From 9a873d6c0e19f5f85c0bd4fdcd135450189afdea Mon Sep 17 00:00:00 2001 From: wujingjing <gersonwu@qq.com> Date: 星期日, 03 十一月 2024 15:15:54 +0800 Subject: [PATCH] 流式获取数据 --- src/api/ai/chat.ts | 24 +++++++++-- package-lock.json | 30 +++++++------- src/utils/request.ts | 49 +++++++++++++++++++++++- package.json | 2 4 files changed, 81 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index f29faae..d502b99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", "amis": "^3.2.0", - "axios": "^1.3.4", + "axios": "^1.7.7", "bimfacesdkloader": "^0.1.0", "countup.js": "^2.5.0", "cropperjs": "^1.5.13", @@ -2725,11 +2725,11 @@ } }, "node_modules/axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "1.7.7", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -4717,9 +4717,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", @@ -11481,11 +11481,11 @@ } }, "axios": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.3.4.tgz", - "integrity": "sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ==", + "version": "1.7.7", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -13047,9 +13047,9 @@ } }, "follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==" }, "foreground-child": { "version": "3.2.1", diff --git a/package.json b/package.json index 73f3975..fe610e1 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.12", "amis": "^3.2.0", - "axios": "^1.3.4", + "axios": "^1.7.7", "bimfacesdkloader": "^0.1.0", "countup.js": "^2.5.0", "cropperjs": "^1.5.13", diff --git a/src/api/ai/chat.ts b/src/api/ai/chat.ts index b517867..2226aaf 100644 --- a/src/api/ai/chat.ts +++ b/src/api/ai/chat.ts @@ -1,4 +1,4 @@ -import request from '/@/utils/request'; +import request, { streamReq } from '/@/utils/request'; const GET_SECTION_SAMPLE_API = '/scene/get_scene_group_sample'; const GET_SECTION_A_LIST_API = '/scene/get_scene_group_tree'; export const Get_LOGIN_SMS = '/login_sms'; @@ -255,6 +255,20 @@ }, }); }; +/** + * @description 娴佸紡澶фā鍨嬪璇� + * @param {FormData} params + **/ +export const questionStreamByPost = (params, callback: (value) => void) => + streamReq( + { + url: `/chat/question_stream`, + method: 'post', + params: {}, + data: params, + }, + callback + ); /** * @summary AI澶фā鍨嬪璇� @@ -360,11 +374,11 @@ /** * 鏇茬嚎鏌ヨ - * @param params - * @param req - * @returns + * @param params + * @param req + * @returns */ -export const curveQuery = (params,req:any=request) =>{ +export const curveQuery = (params, req: any = request) => { return req({ url: 'chat/chat_supervisor_json', method: 'POST', diff --git a/src/utils/request.ts b/src/utils/request.ts index c8756bf..a79a4c5 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -1,13 +1,13 @@ -import type { AxiosInstance, AxiosRequestConfig } from 'axios'; +import type { AxiosInstance, AxiosRequestConfig, CreateAxiosDefaults } from 'axios'; import axios from 'axios'; import { ElMessage } from 'element-plus'; import { NO_AUTH_API_LIST } from '../api/ai/chat'; import { LOGIN_URL, TEL_LOGIN_URL } from '../api/ai/user'; +import { Logger } from '../model/logger/Logger'; import emitter from './mitt'; import { debounce, decodeFormData } from './util'; import { AUTH_URL, MAIN_URL, SECONDARY_URL } from '/@/constants'; import { Local, LoginInfo, Session } from '/@/utils/storage'; -import { Logger } from '../model/logger/Logger'; // import JSONbig from 'json-bigint'; //#region ====================== 鍚庣 res.err_code ====================== @@ -128,18 +128,61 @@ ); }; // 閰嶇疆鏂板缓涓�涓� axios 瀹炰緥 -const createAxiosInstance = () => { +const createAxiosInstance = (option: Partial<CreateAxiosDefaults<any>> = {}) => { return axios.create({ baseURL: MAIN_URL, timeout: 50000, headers: { 'Content-Type': 'application/json;charset=utf-8 ' }, + ...option, }); }; + const service = createAxiosInstance(); export const mainRequest = service; +//#region ====================== 娴佸搷搴旀暟鎹� ====================== +const streamInstance = createAxiosInstance({ + adapter: 'fetch', + responseType: 'stream', +}); +const decoder = new TextDecoder(); +const encoder = new TextEncoder(); +const readStream = async (stream: ReadableStream, cb: (value) => void) => { + const reader = stream.getReader(); + let lastValue = new Uint8Array(); + while (1) { + const { done, value } = await reader.read(); + if (done) { + break; + } + const txt = decoder.decode(Uint8Array.from([...lastValue, ...value])); + const txtArr = txt.split('\n'); + txtArr.forEach((value, index, array) => { + // 涓�鑸笉浼氬嚭鐜拌繛缁崲琛岋紝鍙彲鑳芥渶鍚庝竴涓槸鎹㈣ + if (index === array.length - 1) { + // 缂栫爜鍥炲幓锛屼腑鏂囧垏鍒嗕細涔辩爜 + lastValue = encoder.encode(value); + } else { + cb(value); + } + }); + } +}; + +export const streamReq = (config: AxiosRequestConfig<any>, callback: (value) => void) => { + streamInstance(config).then((response) => { + const stream = response as unknown as ReadableStream; + readStream(stream, (value) => { + const jsonValue = JSON.parse(value); + callback(jsonValue); + }); + }); +}; +//#endregion + initRequestInterceptor(service); +initRequestInterceptor(streamInstance); export function secondaryRequest(config: AxiosRequestConfig<any>) { return service({ -- Gitblit v1.9.3