uniapp如何接入星火大模型

news2025/4/5 21:30:05

写在前面:最近的ai是真的火啊,琢磨了一下,弄个uniappx的版本开发个东西玩一下,想了想不知道放啥内容,突然觉得deepseek可以接入,好家伙,一对接以后发现这是个付费的玩意,我穷,最后找了个免费的ai对接了-讯飞星火(这个免费指的是部分功能免费,并且有免费额度,总的来说自己玩一下够用了)

注意:我用的是Spark4.0 Ultra这个模型,以下代码都是这个模型对接使用的。

1、去讯飞自己注册一下,获取key(免费额度用一点少一点,测试还是要悠着点)

控制台-讯飞开放平台

接口文档:(多看看文档,可以解决很多问题)

星火认知大模型Web API文档 | 讯飞开放平台文档中心

注意:用的WebSocket的方式连接, 对方给你返回的数据是一点一点给的,你需要处理一下如何再展示。

效果图:

以下是完整代码:

<template>
  <view class="container">
    <scroll-view class="message-list" scroll-y>
      <view v-for="(msg, index) in messages" :key="index" class="message">
        {{ msg.role === 'user' ? '我:' : 'AI:' }} {{ msg.content }}
      </view>
    </scroll-view>
    
    <view class="input-area">
      <input v-model="inputText" placeholder="请输入问题" @confirm="sendMessage" class="inputText"/>
      <button @click="sendMessage" class="butSub">发送</button>
    </view>
  </view>
</template>

<script>
import CryptoJS from 'crypto-js'; // 需要安装crypto-js库

 const apiKey = 'your_api_key';      // 替换为你的API Key
 const apiSecret = 'your_api_secret'; // 替换为你的API Secret
 const appid = 'your_appid';          // 替换为你的AppID
			
export default {
  data() {
    return {
      inputText: '',
      messages: [],
      socketTask: null,
			textCont:[]
    };
  },
  methods: {
		// 确保连接可用的方法
		async ensureConnection() {
		  if (!this.socketTask || this.socketTask.readyState !== 1) {
		    await new Promise((resolve, reject) => {
		      this.connectWebSocket(); // 重新建立连接
		      
		      // 设置连接超时
		      const timeout = setTimeout(() => {
		        reject(new Error('连接超时'));
		      }, 5000);
			
		      // 监听连接成功
		      this.socketTask.onOpen(() => {
		        clearTimeout(timeout);
		        resolve();
		      });
			
		      // 监听连接失败
		      this.socketTask.onError((err) => {
		        clearTimeout(timeout);
		        reject(err);
		      });
		    });
		  }
		  return true;
		},
			
		// 修改后的发送方法
		async sendMessage() {
		  if (!this.inputText.trim()) return;
			
		  try {
		    // 添加加载状态
		    this.isSending = true;
		    
		    // 确保连接有效
		    await this.ensureConnection();
			
		    // 添加用户消息到历史
		    this.messages.push({
		      role: 'user',
		      content: this.inputText
		    });
			
		    // 构造请求数据(需包含之前修正的domain参数)
		    const requestData = {
		      header: {
		        app_id: appid,
		        uid: 'user123'
		      },
		      parameter: {
		        chat: {
		          domain: '4.0Ultra',
		          temperature: 0.5,
		          max_tokens: 8192
		        }
		      },
		      payload: {
		        message: {
		          text: this.messages
		        }
		      }
		    };
			
		    // 发送消息
		    await new Promise((resolve, reject) => {
		      this.socketTask.send({
		        data: JSON.stringify(requestData),
		        success: resolve,
		        fail: reject
		      });
		    });
			
		    this.inputText = '';
		  } catch (err) {
		    console.error('发送失败:', err);
		    uni.showToast({
		      title: '消息发送失败,请重试',
		      icon: 'none'
		    });
		    // 自动重连机制
		    this.reconnect();
		  } finally {
		    this.isSending = false;
		  }
		},
			
		// 重连机制
		reconnect() {
		  if (this.reconnecting) return;
		  this.reconnecting = true;
		  
		  // 指数退避重试
		  let retries = 0;
		  const maxRetries = 3;
		  
		  const attemptReconnect = () => {
		    this.connectWebSocket();
		    this.socketTask.onOpen(() => {
		      this.reconnecting = false;
		      uni.showToast({
		        title: '重新连接成功',
		        icon: 'none'
		      });
		    });
		    
		    this.socketTask.onError(() => {
		      if (retries < maxRetries) {
		        retries++;
		        setTimeout(attemptReconnect, Math.pow(2, retries) * 1000);
		      } else {
		        this.reconnecting = false;
		        uni.showToast({
		          title: '连接服务器失败',
		          icon: 'none'
		        });
		      }
		    });
		  };
		  
		  attemptReconnect();
		},
    // 生成请求签名
    getWebsocketUrl() {
      const date = new Date().toGMTString();
      const host = 'spark-api.xf-yun.com';
      const path = '/v4.0/chat';
      // 生成签名
      const tmp = `host: ${host}\ndate: ${date}\nGET ${path} HTTP/1.1`;
      const signature = CryptoJS.enc.Base64.stringify(
        CryptoJS.HmacSHA256(tmp, apiSecret)
      );
      
      // 构造授权参数
      const authorization = 
        `api_key="${apiKey}", algorithm="hmac-sha256", headers="host date request-line", signature="${signature}"`;
      
      // 生成WebSocket URL
      return `wss://${host}${path}?` + 
        `authorization=${btoa(authorization).replace(/=+$/, '')}` +
        `&date=${encodeURIComponent(date)}` +
        `&host=${encodeURIComponent(host)}`;
    },

    // 建立WebSocket连接
    connectWebSocket() {
      const url = this.getWebsocketUrl();
      
      this.socketTask = uni.connectSocket({
        url: url,
        success: () => {
          console.log('WebSocket连接建立中...');
        },
        fail: (err) => {
          console.error('连接失败:', err);
        }
      });
			// 在onError回调中增加详细错误处理
			this.socketTask.onError((err) => {
			  console.error('WebSocket错误详情:', {
			    errCode: err.errCode,
			    errMsg: err.errMsg,
			    errObj: JSON.stringify(err)
			  });
			});


      // 监听事件
      this.socketTask.onOpen(() => {
        console.log('WebSocket连接已打开');
      });

      this.socketTask.onMessage((res) => {
        const data = JSON.parse(res.data);
				console.log(data,'---*****-发送信息--',)
        this.handleResponse(data);
      });

      this.socketTask.onError((err) => {
        console.error('WebSocket错误:', err);
      });

      this.socketTask.onClose(() => {
        console.log('WebSocket连接已关闭');
      });
    },

    // 处理响应
    handleResponse(data) {
      if (data.header.code !== 0) {
        // console.error(data,'请求错误:', data.header);
				uni.showToast({
				    title: `错误代码: ${data.header.code}`,
				    icon: 'none'
				  });
				  console.error('完整错误信息:', data.header);
        return;
      }

      // 拼接结果
			const textArr=data.payload.choices.text;
			
			if(textArr.length>0){
				for(let i=0;i<textArr.length;i++){
					this.textCont.push(textArr[i].content)
				}
			}
			console.log(this.textCont,'===textCont=====')
			const content =this.textCont
      const index = this.messages.findIndex(msg => msg.role === 'assistant');
			console.log(data,'====data====接受消息',content)
      if (index !== -1) {
        this.messages[index].content += content;
      } else {
        this.messages.push({
          role: 'assistant',
          content: content
        });
      }

      // 滚动到底部
      this.$nextTick(() => {
        const query = uni.createSelectorQuery().in(this);
        query.select('.message-list').boundingClientRect();
        query.exec(res => {
          if (res) {
            uni.pageScrollTo({
              scrollTop: res.height,
              duration: 300
            });
          }
        });
      });

      // 关闭连接
      if (data.header.status === 2) {
        this.socketTask.close();
      }
    },

  },
  mounted() {
    this.connectWebSocket();
  },
  beforeDestroy() {
    if (this.socketTask) {
      this.socketTask.close();
    }
  }
};
</script>

<style>
.container {
  padding: 20px;
}

.message-list {
  height: calc(90vh - 105px);
  margin-bottom: 20px;
  border: 1px solid #eee;
  padding: 10px;
}

.message {
  margin: 10px 0;
  padding: 8px;
  background: #f5f5f5;
  border-radius: 4px;
}

.input-area {
  display: flex;
  gap: 10px;
}

.inputText {
  /* flex: 1; */
  border: 1px solid #ccc;
  padding: 0 8px;
  border-radius: 4px;
	margin-bottom: 15px;
	height: 40px;
}

.butSub {
  /* padding: 8px 16px; */
  background: #007AFF;
  color: white;
  border: none;
	height: 40px;
	line-height: 40px;
  border-radius: 4px;
}
</style>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL vs MSSQL 对比

在企业数据库管理系统中&#xff0c;MySQL 和 Microsoft SQL Server&#xff08;MSSQL&#xff09;是最受欢迎的两大选择。MySQL 是一款开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;由 MySQL AB 开发&#xff0c;现归属于 Oracle 公司。而 MSSQL 是微…

python基础-10-组织文件

文章目录 【README】【10】组织文件&#xff08;复制移动删除重命名&#xff09;【10.1】shutil模块(shell工具)【10.1.1】复制文件和文件夹【10.1.1.1】复制文件夹及其下文件-shutil.copytree 【10.1.2】文件和文件夹的移动与重命名【10.1.3】永久删除文件和文件夹【10.1.4】用…

ORA-09925 No space left on device 问题处理全过程记录

本篇文章关键字&#xff1a;linux、oracle、审计、ORA-09925 一、故障现像 朋友找到我说是他们备份软件上报错。 问题比较明显&#xff0c;ORA-09925&#xff0c;看起来就是空间不足导致的 二、问题分析过程 这里说一下逐步的分析思路&#xff0c;有个意外提前说一下就是我…

多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测

多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测&#…

27信号和槽_自定义信号(2)

自定义信号和槽 绑定信号和槽 如何才能触发出自定义的信号呢?&#xff08;上诉代码只是将信号和槽绑定在一起&#xff0c;但并没有触发信号&#xff09; Qt 内置的信号,都不需要咱们手动通过代码来触发 用户在 GUI, 进行某些操作,就会自动触发对应信号.(发射信号的代码已经内置…

人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开!

人工智能在生物医药领域的应用地图&#xff1a;AIBC2025将于6月在上海召开&#xff01; 近年来&#xff0c;人工智能在生物医药行业中的应用受到广泛关注。 2024年10月&#xff0c;2024诺贝尔化学奖被授予“计算蛋白质设计和蛋白质结构预测”&#xff0c;这为行业从业人员带来…

2025.3.19

1、用vim编辑/etc/hosts文件&#xff0c;将本机和第二个虚拟机的ip地址和主机名写入该文件&#xff0c;然后ping 两个主机的主机名能否ping通&#xff1b; &#xff08;1&#xff09;在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…

深度学习 Deep Learning 第16章 结构化概率模型

深度学习 Deep Learning 第16章 结构化概率模型 内容概要 本章深入探讨了结构化概率模型&#xff08;Graphical Models&#xff0c;包含有向图和无向图模型&#xff09;的概念及其在深度学习中的应用。结构化概率模型通过图结构描述随机变量之间的直接交互&#xff0c;从而简…

鸿蒙 harmonyOS 网络请求

应用通过HTTP发起一个数据请求&#xff0c;支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 第一步 &#xff1a; 在module.json5文件里面添加网络…

进程概念(Linux)

目录 一. 冯诺依曼体系结构 二. 操作系统(OS(操作系统的英文缩写Operator System)) 2.1概念 2-2 设计OS的目的 2.3 核心功能 2.4 如何管理&#xff08;先描述再组织&#xff09; 2.5 系统调用和库函数概念 三.进程 3.1 基本概念与基本操作 3.2 描述进程-PCB 3.3 如何…

免费在线MBTI性格测试工具 - 探索你的性格特质

免费在线MBTI性格测试工具 - 探索你的性格特质 简介 我很高兴为大家分享这个专业的MBTI性格测试工具。这是一个完全免费的在线测试系统&#xff0c;基于迈尔斯-布里格斯类型指标(MBTI)理论开发&#xff0c;旨在帮助您更好地了解自己的性格特征&#xff0c;发现职业发展方向。…

AI 数理逻辑基础之统计学基本原理(上)

目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况&#xff1a;中位数、众数、平均值统计数据的离散程度&#xff1a;极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…

积分赛——读取实时时间

设计要求 调用DS1302芯片驱动程序&#xff0c;读取DS1302中的实时时分秒数据&#xff0c;并显示在数码管上。 23时59分59秒 通过串口发送时间作为定时时间&#xff0c;定时时间到则蜂鸣器响2s后静音。 串口发送格式&#xff1a;“12&#xff1a;35&#xff1a;66”。 备注&…

进程和线程的概念及Linux操作

文章目录 一、进程与线程1、进程2、线程3、查看进程与线程 二、Linux的“虚拟内存管理”&#xff0c;它与stm32中的 真实物理内存&#xff08;内存映射&#xff09;有什么区别&#xff1f;三、Linux系统调用函数 fork()、wait()、exec() 等1、fork&#xff08;&#xff09;函数…

APang网联科技项目报告【服务器篇】

APang网联科技&#xff1a;连接未来&#xff0c;智能领航 公司简介 APang网联科技成立于 [2005年]&#xff0c;总部位于 [广东深圳]&#xff0c;是一家集网络技术研发、系统集成、项目实施与运维服务为一体的高新技术企业。我们致力于为客户提供全方位、定制化的网络部署解决…

[MySQL初阶]MySQL表的操作

MySQL表的操作 1. 创建表2. 查看表结构3. 修改表&#xff08;修改表的属性而非表的数据&#xff09;4. 删除表 1. 创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储…

AI助力高效PPT制作:从内容生成到设计优化

随着人工智能技术的不断发展&#xff0c;AI在各个领域的应用日益普及&#xff0c;尤其是在文档和演示文稿的创建过程中。PowerPoint&#xff08;PPT&#xff09;作为最常用的演示工具之一&#xff0c;借助AI的技术手段&#xff0c;可以极大地提高制作效率并提升最终呈现效果。在…

《双影奇境》手机版上线?ToDesk用跨平台技术实现「全设备云电脑3A游戏」

《双影奇境》是由Hazelight Studios研发发行的一款双人合作冒险类游戏&#xff0c;玩家们在游戏中将扮演米欧和佐伊两位风格迥异的女作家&#xff0c;剧情讲述的是她们被骗进入一台意在窃取创意的机器后便陷入了自己创作的故事之中&#xff0c;并且必须相互依靠&#xff0c;努力…

spring IOC 反射 bean生命周期

目录 反射 反射三种方式 获取反射中的Class对象 通过反射创建类对象 通过反射获取类属性、方法、构造器 IOC 概念 原理 实现方式 基于 XML 配置 基于注解配置 IOC优点 IOC的初始化过程 1. 资源定位 3. Bean 定义注册 4. BeanFactory 后置处理 5. Bean 后置处理…

Pytorch中预置数据集的加载方式

Pytorch中数据集加载方式 数据类型​PyTorch 模块​是否预置数据集图像/视频torchvision.datasets✅ 是音频torchaudio.datasets✅ 是文本torchtext.datasets✅ 是&#xff08;需安装&#xff09;自定义数据torch.utils.data❌ 否&#xff08;需手动实现&#xff09;多模态/第三…