在nodejs中使用讯飞星火大模型3.0的demo
2023-12-21 16:42:32
需求:
在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即可 格式如: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
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!