在nodejs中使用讯飞星火大模型3.0的demo

需求:

在nodejs引入讯飞星火大模型的api接口,

思路

看了一下官方文档 api连接为一个WebSocket Secure(WSS)连接,具体思路如下:

  1. 引入 cryptows 模块,分别用于生成加密签名和创建 WebSocket 连接。(这里要提前下载这两个模块
  2. 获取当前时间的 GMT 字符串,构建访问路径 tmp
  3. 获取讯飞星火的 API 密钥和密钥,以及应用程序的 ID。
  4. 使用 HMAC-SHA256 算法生成 tmp 的签名,并将其与 API 密钥等信息组成授权头。
  5. 将授权信息编码为 Base64 格式,构建访问星火 API 的 WebSocket URL。
  6. 创建 WebSocket 连接,并在连接打开时发送聊天请求。
  7. 监听连接的错误、消息和关闭事件,根据事件执行相应的处理,最终将结果通过 resolvereject 返回。

总体而言,是通过 WebSocket 连接与讯飞星火 API 进行通信,发送聊天请求并获取对应的响应。
 

获取appid,apiSecret,apiKey,检查token次数

  • 首先要注册星火大模型账号,然后进入控制台控制台-讯飞开放平台
  • 创建应用如下,自己创建(中间过程忘记了)

  • 最重要的获取次数选择自己需要的模型购买


     

最后检查控制台有无次数,获取到appid,apiSecret,apiKey

代码

// 访问讯飞星火 API 的方法
function initUrl() {
  return new Promise((resolve, reject) => {
    // 初始化问题值为空字符串
    let questionValue = '';
    
    // 引入加密和 WebSocket 模块
    const crypto = require('crypto');
    const ws = require('ws');

    // 获取当前时间的 GMT 字符串
    const dateString = new Date().toGMTString();
    
    // 定义星火 API 的主机和路径
    const host = 'spark-api.xf-yun.com';
    const path = '/v3.1/chat';

    // 构建用于签名的请求头
    let tmp = `host: ${host}\ndate: ${dateString}\nGET ${path} HTTP/1.1`;

    const APISecret = process.env.XH_APISECRET;  // 星火 APISecret 这里直接填入你自己的APISecret即可 格式如:ZjAafHbiODRdMjiyamM1azc3Yju1gMy1
    let signature = crypto
      .createHmac('sha256', APISecret)
      .update(tmp)
      .digest('base64');

    const APIKey = process.env.XH_APIKEY;  // 星火 APIKey 这里直接填入你自己的APISecret即可 格式如:4220a1b1881d40e8d70eb23fd1225cd1
    const authorization_origin = `api_key="${APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="${signature}"`;

    // 将授权信息编码为 Base64 格式
    let buff = Buffer.from(authorization_origin);
    const authorization = buff.toString('base64');

    // 构建访问星火 API 的 WebSocket URL
    const signUrl = `wss://${host}${path}?authorization=${authorization}&date=${encodeURIComponent(dateString)}&host=${host}`;

    // 创建 WebSocket 连接
    let sock = new ws(signUrl);

    // 当连接打开时发送聊天请求
    sock.on('open', function () {
      console.log('讯飞星火连接sock连接成功!!!!');
      sock.send(
        JSON.stringify({
          header: {
            app_id: process.env.XH_APPID,  // 星火应用程序 ID  APPID 格式为 dbfab529
          },
          parameter: {
            chat: {
              domain: 'generalv3',
              temperature: 0.5,
              max_tokens: 1024,
            },
          },
          payload: {
            message: {
              text: [
                {
                  role: 'user',
                  content: 'js中数组去重的方法有哪些?',
                },
              ],
            },
          },
        })
      );
    });

    // 监听连接的错误事件
    sock.on('error', function (err) {
      console.log('error: ', err);
      reject(err);
    });

    // 监听消息事件,处理 API 响应
    sock.on('message', function (data) {
      // 解析 API 响应的 JSON 数据
      const obj = JSON.parse(data);
      // 提取文本消息
      const texts = obj.payload.choices.text;
      
      // 将文本消息拼接到问题值中
      texts.forEach((item) => {
        questionValue += item.content;
      });
    });

    // 监听连接关闭事件,将结果通过 resolve 返回
    sock.on('close', function () {
      resolve(questionValue);
    });
  });
}

// 导出 initUrl 函数
module.exports = initUrl;

注意:这里的 appid,apiSecret,apiKey, 一定要换成你自己的不然会收到错误的结果如下,还要检查自己是否有权限访问,检查自己是否有3.0的token次数,我封装的函数里面是对返回结果进行处理了的。

{"header":{"code":10005,"message":"InvalidParamError:(17:15:17.428) app_id is not same to kong app_id","sid":"cid000b592e@dx18b661de604b81d550","status":2}}

调用函数

 initUrl('数组去重的方法有哪些?').then((result) => {
                console.log('Result:', result);
            }).catch((err) => {
                console.error('Error:', err);
            });

控制台输出结果如下

记录一下。。。。。。。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

27. 过滤器

Filter(过滤器)简介 Filter 的基本功能是对 Servlet 容器调用 Servlet 的过程进行拦截,从而在 Servlet 进行响应处理的前后实现一些特殊的功能。在 Servlet API 中定义了三个接口类来开供开发人员编写 Filter 程序:Filter, FilterChain, FilterConfigFi…

PHP笔记

文章目录 PHP一、什么是PHP二、PHP集成环境的安装三、WampServer四、PHP基础PHP标准格式php注释变量的定义传值替换变量的作用域变量的检测与删除static静态变量进制转换响应头字符串边界定位符字符串函数常量的定义三元表达式 五、基础文件引入点函数参数类型约束以及严格模式…

OpenAI 官方 Prompt 工程指南:写好 Prompt 的六个策略

其实一直有很多人问我,Prompt 要怎么写效果才好,有没有模板。 我每次都会说,能清晰的表达你的想法,才是最重要的,各种技巧都是其次。但是,我还是希望发给他们一些靠谱的文档。 但是,网上各种所…

Postman接口测试之Post、Get请求方法

一、基础知识 1.HTTP的五种请求方法:GET, POST ,HEAD,OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。 GET请求:请求指定的页面信息,并返回实体主体。(通常用…

“用户名不在 sudoers文件中,此事将被报告” 解决方法

原因 当普通用户需要安装文件时,无法用yum install ** -y直接安装时,采用sudo yum install **; 但是发现提示“用户名不在 sudoers文件中,此事将被报告” 解决方法。 这是因为该普通用户不在sudoers文件中,所以要找到该文件&am…

SpringIOC之BeanFactoryResolver

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…

2024年软件测试工程师如何从功能测试转成自动化测试?

前言 接触了太多测试同行&#xff0c;由于多数同行之前一直做手工测试&#xff0c;现在很迫切希望做[<u>自动化测试</u>](javascript:;)&#xff0c;其中不乏工作5年以上的同行。 从事软件自动化测试已经近十年&#xff0c;接触过底层服务端、API 、Web、APP、H5…

Ethercat 读从站状态报文分析

涉及的从站寄存器&#xff1a;Register AL Status 0x0130:0x0131 。 1&#xff0c;发送报文 1&#xff09;IgH dmesg看到的报文 [18773.590655] geshifei ec_master_send_datagrams 1059: Adding datagram datagram->index0 [18773.590656] EtherCAT DEBUG 0: frame siz…

机器学习---推荐系统案例(二)

四、推荐系统---模型训练 1、模型训练代码 模型训练代码参照scala文件&#xff1a;Recommonder.scala 1.Logger.getLogger("org.apache.spark").setLevel(Level.ERROR) 2.val conf new SparkConf().setAppName("recommonder").setMaster("local[*…

《成才》期刊投稿方式发表要求

《成才》杂志是国家新闻出版总署批准&#xff0c;面向国内外公开发行的教育期刊&#xff0c;以“大教育视野、新理念成才”为办刊宗旨&#xff0c;全面贯彻党的教育方针&#xff0c;理论联系实际&#xff0c;开展教育科学研究和人才培养研究&#xff0c;交流科技成果&#xff0…

TrustZone之示例用例——加密文件系统

移动设备如智能手机包含大量个人数据。如果设备丢失或被盗&#xff0c;用户会关心这些数据的机密性。这就是为什么大多数最新的设备支持文件系统加密的原因。TrustZone 可以作为保护这些数据的解决方案的一部分。 存储在外部闪存中的数据是加密的。在启动时&#xff0c;设备对用…

React学习计划-React16--React基础(二)组件与组件的3大核心属性state、props、ref和事件处理

1. 组件 函数式组件&#xff08;适用于【简单组件】的定义&#xff09; 示例&#xff1a; 执行了ReactDOM.render(<MyComponent/>, ...)之后执行了什么&#xff1f; React解析组件标签&#xff0c;找到了MyComponent组件发现组件是使用函数定义的&#xff0c;随后调用该…

Hive文件存储与压缩

压缩和存储 1、 Hadoop压缩配置 1) MR支持的压缩编码 压缩格式工具算法文件扩展名是否可切分DEFAULT无DEFAULT.deflate否GzipgzipDEFAULT.gz否bzip2bzip2bzip2.bz2是LZOlzopLZO.lzo否LZ4无LZ4.lz4否Snappy无Snappy.snappy否 为了支持多种压缩/解压缩算法&#xff0c;Hadoop…

数据结构 | 查漏补缺

目录 数据的基本单位 冒泡排序 DFS和BFS中文 Prim 比较 中序线索二叉树 顺序栈 链栈 时间复杂度 循环队列 求第K个结点的值 数据的基本单位 数据元素 循环队列sq中&#xff0c;用数组elem[0‥25]存放数据元素&#xff0c;设当前sq->front为20&#xff0c;sq-&g…

【C++11特性篇】模板的新一力将:可变参数模板 [全解析]

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》专…

循环神经网络中的梯度消失或梯度爆炸问题产生原因分析(二)

上一篇中讨论了一般性的原则&#xff0c;这里我们具体讨论通过时间反向传播&#xff08;backpropagation through time&#xff0c;BPTT&#xff09;的细节。我们将展示目标函数对于所有模型参数的梯度计算方法。 出于简单的目的&#xff0c;我们以一个没有偏置参数的循环神经…

华为鸿蒙开发应用工程师:连接未来,创造无限可能

1. 引言 随着智能设备的不断普及和发展&#xff0c;华为鸿蒙作为下一代全场景分布式操作系统&#xff0c;为开发者提供了全新的应用开发平台。作为一名鸿蒙开发应用工程师&#xff0c;您将扮演连接未来的重要角色&#xff0c;为智能生活创造无限可能。 2. 深度参与全场景应用…

modbus异常错误码说明

异常错误码说明 其中物理离散量输入和输入寄存器只能有I/O系统提供的数据类型&#xff0c;即只能是由I/O系统改变离散量输入和输入寄存器的数值&#xff0c;而上位机程序不能改变的数据类型&#xff0c;在数据读写上表现为只读&#xff0c;而内部比特或者物理线圈和内部寄存器或…

Profinet转485modbus网关解决传输距离及数据丢失问题

Profinet转485modbus网关&#xff08;XD-MDPN100/2000&#xff09;是一款能够解决传输距离及数据丢失问题的设备。在现场应用中&#xff0c;数据的传输距离和数据丢失最为常见的问题。 在现场添加Profinet转485modbus网关&#xff08;XD-MDPN100/2000&#xff09;即可解决传输距…

BDD - Python Behave 入门

BDD - Python Behave 入门 Behave 是什么Behave 的主要特点和组成部分Behave 实践安装 BehaveBehave 项目目录结构创建项目创建 Feature 文件创建步骤定义文件 执行用例执行全部用例执行部分用例 生成报告生成 Json report生成 HTML 报告生成 Junit report生成 Cucumber report…