99AI/dist/modules/chatgpt/baidu.js
2024-01-17 09:22:28 +08:00

94 lines
3.3 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.sendMessageFromBaidu = exports.getAccessToken = void 0;
const axios = require('axios');
const getApiModelMaps = () => {
let res = {};
const maps = {
'ERNIE-Bot': 'completions',
'ERNIE-Bot-turbo': 'eb-instant',
'BLOOMZ-7B': 'bloomz_7b1',
'ERNIE-Bot-4': 'completions_pro',
'Llama-2-7b-chat': 'llama_2_7b',
'Llama-2-13b-chat': 'llama_2_13b',
'ChatGLM2-6B-32K': 'chatglm2_6b_32k',
'Qianfan-Chinese-Llama-2-7B': 'qianfan_chinese_llama_2_7b',
};
Object.keys(maps).map(key => {
res[`${key.toLowerCase()}`] = maps[key];
});
return res;
};
function getAccessToken(key, secret) {
let url = `https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=${key}&client_secret=${secret}`;
return new Promise((resolve, reject) => {
axios
.post(url)
.then((response) => {
resolve(response.data.access_token);
})
.catch((error) => {
reject(error);
});
});
}
exports.getAccessToken = getAccessToken;
function sendMessageFromBaidu(messagesHistory, { onProgress, accessToken, model, temperature = 0.95 }) {
const endUrl = getApiModelMaps()[model.trim().toLowerCase()];
return new Promise((resolve, reject) => {
const url = `https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/${endUrl}?access_token=${accessToken}`;
var options = {
method: 'POST',
url,
responseType: 'stream',
headers: {
'Content-Type': 'application/json',
},
data: {
stream: true,
messages: messagesHistory,
},
};
axios(options)
.then((response) => {
const stream = response.data;
let resData = {};
let cacheChunk = '';
let cacheResText = '';
stream.on('data', (chunk) => {
const lines = chunk
.toString()
.split('\n\n')
.filter((line) => line.trim() !== '');
for (const line of lines) {
const message = line.replace('data: ', '');
try {
const msg = cacheChunk + message;
const parseData = JSON.parse(msg);
cacheChunk = '';
const { is_end, result } = parseData;
result && (cacheResText += result);
if (is_end) {
resData = parseData;
resData.text = cacheResText;
}
onProgress(parseData);
}
catch (error) {
cacheChunk = message;
}
}
});
stream.on('end', () => {
cacheResText = '';
cacheChunk = '';
resolve(resData);
});
})
.catch((error) => {
reject(new Error(error));
});
});
}
exports.sendMessageFromBaidu = sendMessageFromBaidu;