需求:
在nodejs引入讯飞星火大模型的api接口,
思路
看了一下官方文档 api连接为一个WebSocket Secure(WSS)连接,具体思路如下:
- 引入
crypto
和ws
模块,分别用于生成加密签名和创建 WebSocket 连接。(这里要提前下载这两个模块)- 获取当前时间的 GMT 字符串,构建访问路径
tmp
。- 获取讯飞星火的 API 密钥和密钥,以及应用程序的 ID。
- 使用 HMAC-SHA256 算法生成
tmp
的签名,并将其与 API 密钥等信息组成授权头。- 将授权信息编码为 Base64 格式,构建访问星火 API 的 WebSocket URL。
- 创建 WebSocket 连接,并在连接打开时发送聊天请求。
- 监听连接的错误、消息和关闭事件,根据事件执行相应的处理,最终将结果通过
resolve
或reject
返回。
总体而言,是通过 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即可 格式如:ZjAafHbiODRdMjiyamM1azc3Yju1gMy1let signature = crypto.createHmac('sha256', APISecret).update(tmp).digest('base64');const APIKey = process.env.XH_APIKEY; // 星火 APIKey 这里直接填入你自己的APISecret即可 格式如:4220a1b1881d40e8d70eb23fd1225cd1const 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 URLconst 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);});
控制台输出结果如下
记录一下。。。。。。。