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

发布时间:2023年12月21日

需求:

在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);
            });

控制台输出结果如下

记录一下。。。。。。。?

文章来源:https://blog.csdn.net/T3165919332/article/details/135130248
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。