bdwx-nodejs
Version:
#### 介绍 文心一言 node sdk
137 lines (132 loc) • 6.15 kB
JavaScript
const request = require('request');
const axios = require('axios');
const golbalCfg = require('../config');
// https://login.bce.baidu.com/?redirect=https%3A%2F%2Fconsole.bce.baidu.com%2Ftools%2F%3F_%3D1690950233213#/api?product=AI&project=%E6%96%87%E5%BF%83%E5%8D%83%E5%B8%86%E5%A4%A7%E6%A8%A1%E5%9E%8B%E5%B9%B3%E5%8F%B0&parent=ErnieBot-turbo&api=rpc%2F2.0%2Fai_custom%2Fv1%2Fwenxinworkshop%2Fchat%2Feb-instant&method=post
let wenxinTkObj = {
access_token: '',
lastTime: Date.now(),
expires_in: 122233,
refresh_token: '',
session_secret: ''
}
// https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【API Key】&client_secret=【Secret Key
const getWXTk = function(secretKey, APIKey) {
return new Promise(async (resolve, reject) => {
try {
if (wenxinTkObj.access_token && wenxinTkObj.lastTime > Date.now()) {
resolve(wenxinTkObj.access_token);
return;
};
// console.log('/wenxinTk');
let wenxinTkApi = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${APIKey}&client_secret=${secretKey}`;
let wenxinTkRes = await axios.get(wenxinTkApi);
if (wenxinTkRes && wenxinTkRes.data) {
let wenxinTkResData = wenxinTkRes.data;
wenxinTkObj.lastTime = Date.now() + (wenxinTkResData.expires_in * 1000);
wenxinTkObj.expires_in = wenxinTkResData.expires_in;
wenxinTkObj.refresh_token = wenxinTkResData.refresh_token;
wenxinTkObj.access_token = wenxinTkResData.access_token;
wenxinTkObj.session_secret = wenxinTkResData.session_secret;
};
// console.log('wenxinTkObj:', wenxinTkObj);
resolve(wenxinTkObj.access_token);
} catch (error) {
reject('')
}
});
};
const botChatFn = async function(params = { question: '', stream: false, response: '', secretKey: '', APIKey: '', nodostream: false },
model = 'turboChat', callback = () => {}, failCallback = () => {}) {
if (!params.APIKey || !params.secretKey) {
return failCallback && failCallback('APIKey or secretKey is null');
}
if (!params.question) {
return failCallback && failCallback('question is null');
};
if (params.stream && !params.response) {
return failCallback && failCallback('stream is true but response is null');
};
if (params.stream && params.response) {
params.response.writeHead(200, {
'Content-Type': 'text/event-stream', //核心返回数据流
'Connection': 'close'
});
};
let msgArr;
if (Array.isArray(params.question)) {
msgArr = params.question;
} else {
msgArr = [
{
"role": "user",
"content": params.question
},
];
};
const targetApi = golbalCfg.apis[model];
console.log('targetApi:', targetApi);
if (!targetApi) {
failCallback && failCallback('model is not exist');
return;
}
let options = {
'method': 'POST',
'url': targetApi + '?access_token=' + await getWXTk(params.secretKey, params.APIKey),
'headers': {
'Content-Type': 'application/json'
},
body: JSON.stringify({
"messages": msgArr,
"stream": params.stream
})
};
request(options, function (error, respo) {
if (error) {
return failCallback && failCallback(error);
};
if (params.stream) {
if (respo.pipe) {
console.log('use pipe...');
respo.pipe(params.response);
};
let streamArr = respo.body.split('\n\n').filter(line =>line);
let resultStr = '';
if (params.nodostream && !respo.pipe) {
console.log('use write1...');
params.response.write(respo.body);
}
// console.log('streamArr:',streamArr);
for(let i = 0;i < streamArr.length;i++) {
let streamLine = streamArr[i].trim();
if (streamLine && !params.nodostream && !respo.pipe) {
console.log('use write2...');
params.response.write(`${streamLine}\n\n`);
}
let streamLineReg = /^(data:)\s*\{.+\}$/;
if (streamLine && streamLineReg.test(streamLine)) {
let streamLineParse = JSON.parse(streamLine.replace(streamLineReg, (string, ...args) => {
let filterItem = args[0] || '';
return string.replace(filterItem, '');
}));
if (streamLineParse && streamLineParse.result) {
resultStr += streamLineParse.result || '';
};
};
if (i >= streamArr.length - 1 && !respo.pipe) {
console.log('use write3...');
params.response.write('data: end\n\n');
}
};
callback && callback({
result: resultStr
});
} else {
// console.log(JSON.parse(respo.body));
callback && callback(JSON.parse(respo.body));
}
});
}
module.exports = {
getWXTk,
botChatFn
}