废话不多说直接上代码

// 小程序专用流式服务 
export const streamChatMiniProgram = (messages, options = {secret: ""
}) => {return new Promise((resolve, reject) => {// 构建请求数据 const requestData = {model: 'deepseek-chat',messages,stream: true,max_tokens: 2048,temperature: 0.7};// 平台特定配置const requestConfig = {url: 'https://api.deepseek.com/v1/chat/completions',method: 'POST',header: {'Accept-Charset': 'utf-8','Content-Type': 'application/json','Authorization': `Bearer ${options.secret}`},data: JSON.stringify(requestData),// responseType: 'text',enableChunked: true, // 关键配置:启用分块传输// enableHttp2: true,timeout: 30000};// 跨平台适配 // #ifdef MP-WEIXIN || MP-QQ requestConfig.enableChunked = true;// #endif // #ifdef MP-ALIPAY || MP-BAIDU requestConfig.enableChunked = false;// #endif // 发起请求 const requestTask = wx.request({...requestConfig,// 分块数据接收处理 chunked: requestConfig.enableChunked,success: (res) => {if (res.statusCode !== 200) {reject(new Error(`API错误: ${res.statusCode}`));}},fail: (err) => {reject(new Error(`请求失败: ${err.errMsg}`));}});try {// requestTask.onHeadersReceived((chunk)=>{// 	console.log("onHeadersReceived")// })// requestTask.onProgressUpdate((chunk)=>{// 	console.log("onProgressUpdate")// })// const decoder = new TextDecoder('utf-8') // 显式指定UTF-8requestTask.onChunkReceived((chunk) => {try {if (!requestTaskMap.get(requestTask.uniqueId)) {return;}// 缓冲区初始化为空字符串 let buffer = '';buffer += utf8Decode(chunk.data) //decoder.decode(chunk.data,  { stream: true });// String.fromCharCode.apply(null, new Uint8Array(chunk.data));// SSE格式解析 const lines = buffer.split('\n');buffer = '';for (const line of lines) {if (line.trim() === '') continue;if (line.startsWith('data:')) {const dataStr = line.replace('data:', '').trim();// 结束标记处理 if (dataStr === '[DONE]') {resolve(fullResponse);return;}// 解析JSON内容 try {const data = JSON.parse(dataStr);if (data.choices?.[0]?.delta?.content) {const content = data.choices[0].delta.content;fullResponse += content;// 实时事件通知 uni.$emit('deepseek_stream_update', {partial: content,full: fullResponse});}} catch (e) {console.error('JSON 解析错误', e);uni.$emit('deepseek_stream_update', {partial: 'JSON 解析错误',e,full: 'JSON 解析错误',e});}}}} catch (err) {uni.$emit('deepseek_stream_update', {partial: JSON.stringify(err),full: JSON.stringify(err)});}});} catch (err) {uni.$emit('deepseek_stream_update', {partial: JSON.stringify(err),full: JSON.stringify(err)});}// 存储任务引用以便中断 console.log("requestTask=", requestTask)requestTaskMap.set(requestTask.uniqueId, requestTask);let fullResponse = '';});
};export function utf8Decode(buffer) {let uint8 = new Uint8Array(buffer);let str = '';let i = 0;while (i < uint8.length) {const byte = uint8[i++];// 单字节字符 (0-127)if (byte < 0x80) {str += String.fromCharCode(byte);}// 双字节字符 else if ((byte & 0xE0) === 0xC0) {const byte2 = uint8[i++];str += String.fromCharCode(((byte & 0x1F) << 6) | (byte2 & 0x3F));}// 三字节字符(支持中文)else if ((byte & 0xF0) === 0xE0) {const byte2 = uint8[i++];const byte3 = uint8[i++];str += String.fromCharCode(((byte & 0x0F) << 12) |((byte2 & 0x3F) << 6) |(byte3 & 0x3F));}// 四字节字符(简单兼容)else if ((byte & 0xF8) === 0xF0) {i += 3; // 跳过后续字节str += ''; // 替换字符占位}}return str;
}
// 请求任务管理器 
const requestTaskMap = new Map();
// 中断指定请求
export const abortStreamRequest = (requestId) => {const task = requestTaskMap.get(requestId);if (task) {task.abort();requestTaskMap.delete(requestId);}
};
// 中断所有请求
export const abortAllRequests = () => {requestTaskMap.forEach(task => {task.abort()});requestTaskMap.clear();
};

调用

async startStream() {if (!this.message) {return;}const userMessage = {id: Date.now(),role: 'user',content: this.message};this.messages.push(userMessage);this.message = ""// 构建对话历史 const messages = this.messages.map(m => ({role: m.role,content: m.content}));this.currMessage = {content: "",role: "assistant",thinking: true}this.messages.push(this.currMessage)// 发起流式请求this.loading = trueconst response = await streamChatMiniProgram(messages, {secret: this.deepSeekSecret});this.loading = falsethis.currMessage = undefinedthis.$nextTick(()=>{this.scrollBottom()})}

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

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

相关文章

Softhub软件下载站实战开发(四):代码生成器设计与实现

文章目录 Softhub软件下载站实战开发&#xff08;四&#xff09;&#xff1a;代码生成器设计与实现1.前言 &#x1f4dc;2.技术选型3.架构概览 &#x1f3d7;️3.1 架构概览3.2 工作流程详解 4.核心功能实现 ⏳4.1 配置管理系统4.2 数据库表结构解析4.3 模板渲染引擎4.4 智能类…

鸿蒙组件通用属性深度解析:从基础样式到高级定制的全场景指南

一、引言&#xff1a;通用属性 —— 构建视觉体验的核心语言 在鸿蒙应用开发体系中&#xff0c;组件的视觉呈现与交互体验主要通过通用属性系统实现。这些属性构成了从基础样式定义&#xff08;尺寸、颜色&#xff09;到复杂交互控制&#xff08;动画、布局&#xff09;的完整…

选择与方法专栏(9) 职场内篇: 是否要跳出舒适圈?如何处理犯错?

合集文章 一个中科大差生的8年程序员工作总结_8年工作经验 程序员-CSDN博客 选择与方法专栏&#xff08;1&#xff09;职场外篇&#xff1a;谨慎的选择城市、行业、岗位-CSDN博客 选择与方法专栏&#xff08;2&#xff09;职场外篇&#xff1a; 每个时代都有自己的机遇-CSDN…

DCM4CHEE ARCHIVE LIGHT 源代码解析(1)-前言

系列文章目录 DCM4CHEE ARCHIVE LIGHT 源代码解析(1)-前言DCM4CHEE ARCHIVE LIGHT 源代码解析(2)-STOWRS文章目录 系列文章目录概述一、项目结构1、下载解压代码2、IntelliJ IDEA加载源代码二、编译发布1、编译 dcm4chee-arc-ear 项目2、编译 dcm4chee-arc-ui2 项目写在结尾概…

基于DeepSeek-R1-Distill-Llama-8B的健康管理助手微调过程

基于DeepSeek-R1-Distill-Llama-8B的健康管理助手微调过程 本次创新实训项目的主要任务是利用DEEPSEEK提供的开源模型&#xff0c;通过微调技术&#xff0c;实现一个专注于健康管理与医疗咨询的人工智能助手。本文详细记录我们如何对DeepSeek-R1-Distill-Llama-8B模型进行微调…

TI 毫米波雷达走读系列—— 3DFFT及测角

TI 毫米波雷达走读系列—— 3DFFT及测角 测角原理 —— 角度怎么测测角公式 —— 角度怎么算相位差测角基本公式为什么是3DFFT1. 空间频率与角度的对应关系2. FFT的数学本质&#xff1a;离散空间傅里叶变换 测角原理 —— 角度怎么测 本节内容解决角度怎么测的问题&#xff0c…

图解JavaScript原型:原型链及其分析 02 | JavaScript图解

​ ​ 任何函数既可以看成一个实例对象又可以看成一个函数 作为一个实例对象其隐式原型对象指向其构造函数的显式原型对象 作为一个函数其显式原型对象指向一个空对象 任何一个函数其隐式原型对象指向其构造函数的显式原型对象 任何一个函数是 Function 函数创建的实例&…

自定义View实现K歌开始前歌词上方圆点倒计时动画效果

在上一篇KRC歌词解析原理及Android实现K歌动态歌词效果介绍了动态歌词的实现,我们继续完善一下。在K歌场景中,一些歌曲前奏很长,用户不知道什么时候开始唱,这时一般在歌词上方会有一个圆点倒计时的效果来提醒用户开始时间,如下图:开始唱之前,圆点会逐个减少,直至圆点全…

ffmpeg subtitles 字幕不换行的问题解决方案

使用ffmpeg在mac下处理srt中文字幕可以自动换行&#xff0c;linux环境下不换行直接超出视频区域了 这是因为在mac环境下的SimpleText 渲染器自动处理了文本&#xff0c;而linux无法处理。 mac&#xff1a; linux&#xff1a; 方案&#xff1a; ❌&#xff1a;网上找到的方案…

Trino入门:开启分布式SQL查询新世界

目录 一、Trino 是什么 二、核心概念与架构解析 2.1 关键概念详解 2.2 架构剖析 三、快速上手之安装部署 3.1 环境准备 3.2 安装步骤 3.2.1 下载软件包 3.2.2 安装软件包 3.2.3 启动服务 3.2.4 验证服务 3.2.5 安装 Trino 客户端 3.3 目录结构说明 四、实战演练&…

EFK架构的数据安全性

EFK架构&#xff08;Elasticsearch Filebeat Kibana&#xff09;的数据安全性需通过‌传输加密、访问控制、存储保护‌三层措施保障&#xff0c;其核心风险与加固方案如下&#xff1a; 一、数据传输安全风险与加固 ‌明文传输风险‌ Filebeat → Elasticsearch 的日…

2025年渗透测试面试题总结-安全服务工程师(驻场)(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 安全服务工程师(驻场) 1. 挖过的一些漏洞&#xff08;举例说明&#xff09; 2. 渗透测试的思路&#xff08…

C++ 编译流程详解:从源码到可执行文件

C 编译流程是将人类可读的源代码转换为计算机可执行的二进制文件的过程。这个过程可以分为四个核心阶段&#xff1a;预处理、编译、汇编和链接。每个阶段都有明确的任务&#xff0c;共同确保代码正确转换为可执行程序。 一、预处理&#xff08;Preprocessing&#xff09; 预处…

CentOS7 安装最新版 Docker

在 CentOS 7 上安装最新版 Docker&#xff0c;可以按照以下步骤操作&#xff1a; 1. 卸载旧版本 Docker&#xff08;如有&#xff09; 如果之前安装过旧版 Docker&#xff0c;需要先卸载&#xff1a; yum remove docker docker-client docker-client-latest docker-common do…

网络安全相关知识

一、网络安全基础 1. CIA三元组 (Confidentiality, Integrity, Availability) 机密性 (Confidentiality)&#xff1a;确保信息只能由授权人员查看&#xff0c;防止信息泄露。加密技术&#xff08;如AES、RSA&#xff09;通常用于保护机密性。 完整性 (Integrity)&#xff1a;…

每天一个前端小知识 Day 4 - TypeScript 核心类型系统与实践

TypeScript 核心类型系统与实践 1. 为什么前端面试中越来越重视 TypeScript&#xff1f; 复杂业务场景需要强类型保障稳定性&#xff1b;更好的 IDE 支持和智能提示&#xff1b;降低线上 bug 概率&#xff1b;成熟的工程团队都在使用&#xff1b;对于 React/Vue 项目维护可读性…

uni-app插件,高德地图、地图区域绘制、定位打卡

介绍 高德地图、地图区域绘制、定位打卡 示例 默认 &#xff08;展示地图&#xff0c;是否可以打卡&#xff09; <template><view class"container"><map-positioning-punch:clock-in-area"clockInArea":refresh-timeout"refreshT…

_mm_aeskeygenassist_si128 硬件指令执行的操作

根据Intel的文档&#xff0c;_mm_aeskeygenassist_si128 指令执行以下操作&#xff1a; result[31:0] SubWord(RotWord(temp)) xor Rcon; result[63:32] SubWord(RotWord(temp)); result[95:64] SubWord(RotWord(temp)) xor Rcon; result[127:96] SubWord(RotWord(temp…

爬虫技术:数据获取的利器与伦理边界

一、爬虫技术的原理与架构 爬虫技术的核心是模拟人类浏览网页的行为&#xff0c;通过程序自动访问网站&#xff0c;获取网页内容。其基本原理可以分为以下几个步骤&#xff1a;首先&#xff0c;爬虫程序会发送一个 HTTP 请求到目标网站的服务器&#xff0c;请求获取网页数据。…

TortoiseSVN 下载指定版本客户端及对应翻译(汉化)包

访问官方网站 打开浏览器,进入 TortoiseSVN 官方网站:https://tortoisesvn.net/ ,这是获取官方版本最权威的渠道。 进入下载页面 在官网首页,找到并点击 Downloads(下载)选项,进入下载页面。 选择版本 在下载页面中,会展示最新版本的下载链接。如果需要指定版本,向下…