UNPKG

doomiaichat

Version:

Doomisoft OpenAI

109 lines (108 loc) 5.16 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const openai_1 = __importDefault(require("./openai")); const axios_1 = __importDefault(require("axios")); const ERROR_RESPONSE = ['[AUTHORIZATION NEEDED]', '[AUTHORIZATION ERROR]', '[BODY ERROR]', '[REQUEST ERROR]']; class OpenAIProxy extends openai_1.default { constructor(apiKey, proxyOption, apiOption = {}) { super(apiKey, apiOption); this.proxySetting = proxyOption; } /** * 重写chatRequest方法 * @param chatText * @param callChatOption * @param axiosOption */ chatRequest(chatText, _paramOption, axiosOption) { return __awaiter(this, void 0, void 0, function* () { const opts = Object.assign({ headers: { 'Content-Type': 'application/json', 'authorization': `Bearer ${this.apiKey}` }, method: 'post', url: this.proxySetting.serviceurl, data: { chatText, option: _paramOption } }, axiosOption); const requestResult = yield (0, axios_1.default)(opts); return requestResult.data; }); } /** * 重写chatRequestInStream方法 * @param chatText * @param callChatOption * @param attach * @param axiosOption */ chatRequestInStream(chatText, callChatOption, attach, axiosOption) { return __awaiter(this, void 0, void 0, function* () { // const decoder = new TextDecoder(); //overContent, let streamText, requestid = Math.ceil(Math.random() * (new Date().getTime() * Math.random()) / 1000); const opts = { headers: { 'Content-Type': 'application/json', 'authorization': `Bearer ${this.apiKey}` }, method: 'post', url: this.proxySetting.serviceurl + '/stream', data: { messages: chatText, option: callChatOption, axiosOption }, responseType: 'stream', }; let unCompleteSegment = ''; (0, axios_1.default)(opts) .then(res => { res.data.on('data', (chunk) => { streamText = chunk.toString(); //decoder.decode(chunk); if (streamText) { ///请求的响应发生了错误 if (ERROR_RESPONSE.includes(streamText)) { return this.emit('requesterror', { successed: false, requestid, error: 'Request Remote OpenAI Error : ' + streamText }); } const fullData = (unCompleteSegment + streamText).split('*&$'); unCompleteSegment = ''; // console.log('fullData', fullData.length); for (const segment of fullData) { if (!segment) continue; try { ////判断接收到的不是一个完整的JSON段了,则该段作为下一次的数据段 if (!segment.endsWith('}')) { unCompleteSegment = segment; break; } const objData = Object.assign(JSON.parse(segment), attach); this.emit(objData.finish_reason ? 'chatdone' : 'chattext', objData); } catch (errParse) { break; //this.emit('chaterror', { successed: false, requestid, error: 'JSON parse stream message' + errParse }); } } } return; }); //res.data.on('end', () => { this.emit('chatdone', Object.assign(streamText, attach)); }); }).catch(err => { this.emit('requesterror', { successed: false, requestid, error: 'Axios Error : ' + err }); }); }); } } exports.default = OpenAIProxy;