UNPKG

bdwx-nodejs

Version:

#### 介绍 文心一言 node sdk

137 lines (132 loc) 6.15 kB
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 }