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

uniapp 对接deepseek

废话不多说直接上代码

// 小程序专用流式服务 
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()})}

相关文章:

  • element ui el-table嵌套el-table,实现checkbox联动效果
  • 如何在 MX Linux 上安装 AnyDesk
  • 数据库新选择?KingbaseES在线体验详解
  • 【产线烧录太慢】爱普特APT WDO2烧录器!高速MCU+Flash全协议 离线烧录
  • AI 双轮驱动:工具革新与编程进化如何重塑技术生态
  • 【开源工具】Windows屏幕控制大师:息屏+亮度调节+快捷键一体化解决方案
  • 金仓数据库在线体验平台:开启国产数据库云端探索之旅
  • Excel数据导出小记
  • Uniapp跨端兼容性全方位解决方案
  • Eureka、Nacos、Zookeeper 优雅上下线机制
  • 大模型安全关键技术研究
  • SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
  • Kafka分区机制深度解析:架构原理、负载均衡与性能优化
  • 开源三代示波器720p虚拟界面设计,手机,电脑和Pad均可访问,专用于8通道同步数据采集处理,可玩性高,基于STM32H7(2025-06-17)
  • 02 ( chrome 浏览器插件, 立马翻译), 搭建本地 api
  • 6-16阿里前端面试记录
  • Uniapp设备API全面指南:从位置获取到扫码功能的实现
  • 【Linux】UDP与TCP协议
  • pyqt QMenuBar
  • 【前端基础】摩天之建的艺术:html(上)
  • bootstrap3网站模板/原版百度
  • 优惠券网站怎么做代理/怎样制作网页新手自学入门
  • 手机自建网站平台/2019年 2022疫情爆发
  • 选择常州网站建设公司/杭州seo排名
  • 成安网站建设/查指数
  • web网站开发实战案例/店铺推广软文500字