@leikeduntech/leiai-js 2.3.6 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.d.ts +0 -1
- package/build/index.js +77 -58
- package/package.json +3 -2
package/build/index.d.ts
CHANGED
|
@@ -510,7 +510,6 @@ declare class ChatGPTAPI {
|
|
|
510
510
|
set apiOrg(apiOrg: string);
|
|
511
511
|
protected _buildMessages(text: string, opts: SendMessageOptions): Promise<{
|
|
512
512
|
messages: openai.ChatCompletionRequestMessage[];
|
|
513
|
-
aliyunMessage: any;
|
|
514
513
|
maxTokens: number;
|
|
515
514
|
numTokens: number;
|
|
516
515
|
errorMessage: string;
|
package/build/index.js
CHANGED
|
@@ -108,6 +108,37 @@ async function fetchSSE(url, options, fetch2 = fetch, manufacturer = "OpenAI") {
|
|
|
108
108
|
|
|
109
109
|
// src/chatgpt-api.ts
|
|
110
110
|
import { Spark } from "@leikeduntech/spark-nodejs";
|
|
111
|
+
|
|
112
|
+
// src/utils.ts
|
|
113
|
+
import CryptoJS from "crypto-js";
|
|
114
|
+
var uuidv4Re = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
115
|
+
function isValidUUIDv4(str) {
|
|
116
|
+
return str && uuidv4Re.test(str);
|
|
117
|
+
}
|
|
118
|
+
function signTencentHunyuan(bodyData, url, keyList) {
|
|
119
|
+
const sortedObj = {};
|
|
120
|
+
Object.keys(bodyData).sort().forEach((key) => {
|
|
121
|
+
sortedObj[key] = bodyData[key];
|
|
122
|
+
});
|
|
123
|
+
let signStr = "";
|
|
124
|
+
for (let key in sortedObj) {
|
|
125
|
+
if (signStr) {
|
|
126
|
+
if (typeof sortedObj[key] === "object") {
|
|
127
|
+
signStr += `&${key}=${JSON.stringify(sortedObj[key])}`;
|
|
128
|
+
} else {
|
|
129
|
+
signStr += `&${key}=${sortedObj[key]}`;
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
signStr += `${key}=${sortedObj[key]}`;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
signStr = `${url.replace("https://", "")}?${signStr}`;
|
|
136
|
+
const hmac = CryptoJS.HmacSHA1(signStr, keyList[2]);
|
|
137
|
+
const signBase64 = CryptoJS.enc.Base64.stringify(hmac);
|
|
138
|
+
return signBase64;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// src/chatgpt-api.ts
|
|
111
142
|
var CHATGPT_MODEL = "gpt-3.5-turbo";
|
|
112
143
|
var USER_LABEL_DEFAULT = "User";
|
|
113
144
|
var ASSISTANT_LABEL_DEFAULT = "ChatGPT";
|
|
@@ -155,12 +186,6 @@ var ChatGPTAPI = class {
|
|
|
155
186
|
...completionParams
|
|
156
187
|
};
|
|
157
188
|
this._systemMessage = systemMessage;
|
|
158
|
-
if (this._systemMessage === void 0) {
|
|
159
|
-
const currentDate = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
160
|
-
this._systemMessage = `You are ChatGPT, a large language model trained by ${this._manufacturer}. Answer as concisely as possible.
|
|
161
|
-
Knowledge cutoff: 2021-09-01
|
|
162
|
-
Current date: ${currentDate}`;
|
|
163
|
-
}
|
|
164
189
|
this._maxModelTokens = maxModelTokens;
|
|
165
190
|
this._maxResponseTokens = maxResponseTokens;
|
|
166
191
|
this._getMessageById = getMessageById ?? this._defaultGetMessageById;
|
|
@@ -205,6 +230,13 @@ Current date: ${currentDate}`;
|
|
|
205
230
|
* @returns The response from ChatGPT
|
|
206
231
|
*/
|
|
207
232
|
async sendMessage(text, opts = {}) {
|
|
233
|
+
var _a;
|
|
234
|
+
if (this._systemMessage === void 0 && ["openai", "azure"].indexOf((_a = this._manufacturer) == null ? void 0 : _a.toLowerCase()) > -1) {
|
|
235
|
+
const currentDate = (/* @__PURE__ */ new Date()).toISOString().split("T")[0];
|
|
236
|
+
this._systemMessage = `You are ChatGPT, a large language model trained by ${this._manufacturer}. Answer as concisely as possible.
|
|
237
|
+
Knowledge cutoff: 2021-09-01
|
|
238
|
+
Current date: ${currentDate}`;
|
|
239
|
+
}
|
|
208
240
|
const {
|
|
209
241
|
parentMessageId,
|
|
210
242
|
messageId = uuidv4(),
|
|
@@ -228,7 +260,7 @@ Current date: ${currentDate}`;
|
|
|
228
260
|
text
|
|
229
261
|
};
|
|
230
262
|
const latestQuestion = message;
|
|
231
|
-
const { messages,
|
|
263
|
+
const { messages, maxTokens, numTokens, errorMessage } = await this._buildMessages(
|
|
232
264
|
text,
|
|
233
265
|
opts
|
|
234
266
|
);
|
|
@@ -255,7 +287,7 @@ Current date: ${currentDate}`;
|
|
|
255
287
|
};
|
|
256
288
|
const responseP = new Promise(
|
|
257
289
|
async (resolve, reject) => {
|
|
258
|
-
var
|
|
290
|
+
var _a2, _b, _c, _d, _e;
|
|
259
291
|
let url = `${this._apiBaseUrl}/chat/completions`;
|
|
260
292
|
const headers = {
|
|
261
293
|
"Content-Type": "application/json",
|
|
@@ -289,20 +321,28 @@ Current date: ${currentDate}`;
|
|
|
289
321
|
stream
|
|
290
322
|
};
|
|
291
323
|
if (this._manufacturer.toLowerCase() === "aliyun") {
|
|
324
|
+
body = Object.assign(body, { parameters: { result_format: "message" }, input: { messages } });
|
|
292
325
|
delete body.messages;
|
|
293
|
-
body = Object.assign(body, { input: aliyunMessage });
|
|
294
326
|
} else if (this._manufacturer.toLowerCase() === "zhipu") {
|
|
295
327
|
delete body.messages;
|
|
296
328
|
body = Object.assign(body, { prompt: messages });
|
|
329
|
+
} else if (this._manufacturer.toLowerCase() === "tencent") {
|
|
330
|
+
url = this._apiBaseUrl;
|
|
331
|
+
const timestamp = Math.ceil((/* @__PURE__ */ new Date()).getTime() / 1e3) + 1;
|
|
332
|
+
const keyList = this._apiKey.split(".");
|
|
333
|
+
body = Object.assign(body, { app_id: parseInt(keyList[0]), secret_id: keyList[1], timestamp, expired: timestamp + 24 * 60 * 60, stream: stream ? 1 : 0 });
|
|
334
|
+
delete body.model;
|
|
335
|
+
delete body.max_tokens;
|
|
336
|
+
headers["Authorization"] = signTencentHunyuan(body, url, keyList);
|
|
297
337
|
}
|
|
298
338
|
if (this._apiOrg && this._manufacturer.toLowerCase() === "openai") {
|
|
299
339
|
headers["OpenAI-Organization"] = this._apiOrg;
|
|
300
340
|
}
|
|
301
341
|
if (this._debug) {
|
|
302
|
-
console.log(`api url
|
|
303
|
-
console.log(`api header
|
|
342
|
+
console.log(`api url ${url}`);
|
|
343
|
+
console.log(`api header ${JSON.stringify(headers)}`);
|
|
304
344
|
console.log(`sendMessage (${numTokens} tokens) body: `, body);
|
|
305
|
-
console.log(`sendMessage (${numTokens} tokens) message : `,
|
|
345
|
+
console.log(`sendMessage (${numTokens} tokens) message : `, messages, typeof messages);
|
|
306
346
|
}
|
|
307
347
|
if (this._manufacturer.toLowerCase() === "xunfei") {
|
|
308
348
|
const self = this;
|
|
@@ -351,7 +391,7 @@ Current date: ${currentDate}`;
|
|
|
351
391
|
body: JSON.stringify(body),
|
|
352
392
|
signal: abortSignal,
|
|
353
393
|
onMessage: (data) => {
|
|
354
|
-
var
|
|
394
|
+
var _a3, _b2, _c2, _d2, _e2, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u, _v;
|
|
355
395
|
if (this._debug) {
|
|
356
396
|
}
|
|
357
397
|
if (data === "[DONE]") {
|
|
@@ -360,6 +400,8 @@ Current date: ${currentDate}`;
|
|
|
360
400
|
}
|
|
361
401
|
try {
|
|
362
402
|
const response = JSON.parse(data);
|
|
403
|
+
if (this._debug) {
|
|
404
|
+
}
|
|
363
405
|
if (this._manufacturer.toLowerCase() === "baidu") {
|
|
364
406
|
if ((response == null ? void 0 : response.is_end) === true) {
|
|
365
407
|
result.text += response.result.trim();
|
|
@@ -367,13 +409,13 @@ Current date: ${currentDate}`;
|
|
|
367
409
|
return resolve(result);
|
|
368
410
|
}
|
|
369
411
|
} else if (this._manufacturer.toLowerCase() === "azure") {
|
|
370
|
-
if (((
|
|
412
|
+
if (((_a3 = response.choices[0]) == null ? void 0 : _a3.finish_reason) === "stop") {
|
|
371
413
|
result.text = result.text.trim();
|
|
372
414
|
return resolve(result);
|
|
373
415
|
}
|
|
374
416
|
} else if (this._manufacturer.toLowerCase() === "aliyun") {
|
|
375
|
-
if (((_b2 = response == null ? void 0 : response.output) == null ? void 0 : _b2.finish_reason)
|
|
376
|
-
result.text = response == null ? void 0 : response.output.
|
|
417
|
+
if (["stop", "length"].indexOf((_c2 = (_b2 = response == null ? void 0 : response.output) == null ? void 0 : _b2.choices[0]) == null ? void 0 : _c2.finish_reason) > -1) {
|
|
418
|
+
result.text = (_f = (_e2 = (_d2 = response == null ? void 0 : response.output) == null ? void 0 : _d2.choices[0]) == null ? void 0 : _e2.message) == null ? void 0 : _f.content.trim();
|
|
377
419
|
return resolve(result);
|
|
378
420
|
}
|
|
379
421
|
} else if (this._manufacturer.toLowerCase() === "zhipu") {
|
|
@@ -381,6 +423,11 @@ Current date: ${currentDate}`;
|
|
|
381
423
|
result.text += response == null ? void 0 : response.data.trim();
|
|
382
424
|
return resolve(result);
|
|
383
425
|
}
|
|
426
|
+
} else if (this._manufacturer.toLowerCase() === "tencent") {
|
|
427
|
+
if (((_g = response.choices[0]) == null ? void 0 : _g.finish_reason) === "stop") {
|
|
428
|
+
result.text += (_i = (_h = response == null ? void 0 : response.choices[0]) == null ? void 0 : _h.delta) == null ? void 0 : _i.content.trim();
|
|
429
|
+
return resolve(result);
|
|
430
|
+
}
|
|
384
431
|
}
|
|
385
432
|
if (this._manufacturer.toLowerCase() === "aliyun") {
|
|
386
433
|
if (response == null ? void 0 : response.request_id) {
|
|
@@ -391,11 +438,12 @@ Current date: ${currentDate}`;
|
|
|
391
438
|
result.id = response.id;
|
|
392
439
|
}
|
|
393
440
|
}
|
|
394
|
-
if (((
|
|
441
|
+
if (((_j = response.choices) == null ? void 0 : _j.length) && ["openai", "azure", "tencent"].indexOf(this._manufacturer.toLowerCase()) > -1) {
|
|
395
442
|
const delta = response.choices[0].delta;
|
|
396
443
|
result.delta = delta.content;
|
|
397
444
|
if (delta == null ? void 0 : delta.content)
|
|
398
445
|
result.text += delta.content;
|
|
446
|
+
result.role = "assistant";
|
|
399
447
|
if (delta.role) {
|
|
400
448
|
result.role = delta.role;
|
|
401
449
|
}
|
|
@@ -409,17 +457,17 @@ Current date: ${currentDate}`;
|
|
|
409
457
|
result.detail = response;
|
|
410
458
|
onProgress == null ? void 0 : onProgress(result);
|
|
411
459
|
} else if ((response == null ? void 0 : response.output) && this._manufacturer.toLowerCase() === "aliyun") {
|
|
412
|
-
response.usage = Object.assign(response.usage, { prompt_tokens: (
|
|
460
|
+
response.usage = Object.assign(response.usage, { prompt_tokens: (_k = response.usage) == null ? void 0 : _k.input_tokens, completion_tokens: (_l = response.usage) == null ? void 0 : _l.output_tokens, total_tokens: ((_m = response.usage) == null ? void 0 : _m.input_tokens) + ((_n = response.usage) == null ? void 0 : _n.output_tokens) });
|
|
413
461
|
result.delta = "";
|
|
414
|
-
if ((
|
|
415
|
-
result.text = (
|
|
462
|
+
if ((_q = (_p = (_o = response == null ? void 0 : response.output) == null ? void 0 : _o.choices[0]) == null ? void 0 : _p.message) == null ? void 0 : _q.content)
|
|
463
|
+
result.text = (_t = (_s = (_r = response == null ? void 0 : response.output) == null ? void 0 : _r.choices[0]) == null ? void 0 : _s.message) == null ? void 0 : _t.content;
|
|
416
464
|
result.role = "assistant";
|
|
417
465
|
result.detail = response;
|
|
418
466
|
onProgress == null ? void 0 : onProgress(result);
|
|
419
467
|
} else if ((response == null ? void 0 : response.data) && this._manufacturer.toLowerCase() === "zhipu") {
|
|
420
468
|
if (response.event === "finish") {
|
|
421
|
-
if ((
|
|
422
|
-
response.usage = (
|
|
469
|
+
if ((_u = response == null ? void 0 : response.meta) == null ? void 0 : _u.usage) {
|
|
470
|
+
response.usage = (_v = response == null ? void 0 : response.meta) == null ? void 0 : _v.usage;
|
|
423
471
|
} else {
|
|
424
472
|
response.usage = { prompt_tokens: 1, completion_tokens: 1, total_tokens: 2 };
|
|
425
473
|
}
|
|
@@ -469,7 +517,7 @@ Current date: ${currentDate}`;
|
|
|
469
517
|
result.id = response.id;
|
|
470
518
|
}
|
|
471
519
|
}
|
|
472
|
-
if (((
|
|
520
|
+
if (((_a2 = response == null ? void 0 : response.choices) == null ? void 0 : _a2.length) && ["openai", "azure"].indexOf(this._manufacturer.toLowerCase()) > -1) {
|
|
473
521
|
const message2 = response.choices[0].message;
|
|
474
522
|
result.text = message2.content;
|
|
475
523
|
if (message2.role) {
|
|
@@ -498,13 +546,13 @@ Current date: ${currentDate}`;
|
|
|
498
546
|
}
|
|
499
547
|
}
|
|
500
548
|
).then(async (message2) => {
|
|
501
|
-
var
|
|
549
|
+
var _a2, _b;
|
|
502
550
|
if (message2.detail && !message2.detail.usage) {
|
|
503
551
|
try {
|
|
504
552
|
const promptTokens = numTokens;
|
|
505
553
|
let completionTokens = 0;
|
|
506
554
|
if (["baidu", "aliyun"].indexOf(this._manufacturer.toLowerCase()) > -1) {
|
|
507
|
-
completionTokens = (_b = (
|
|
555
|
+
completionTokens = (_b = (_a2 = message2.detail) == null ? void 0 : _a2.usage) == null ? void 0 : _b.total_tokens;
|
|
508
556
|
} else {
|
|
509
557
|
completionTokens = await this._getTokenCount(message2.text);
|
|
510
558
|
}
|
|
@@ -581,14 +629,14 @@ Current date: ${currentDate}`;
|
|
|
581
629
|
const assistantLabel = ASSISTANT_LABEL_DEFAULT;
|
|
582
630
|
const maxNumTokens = this._maxModelTokens - this._maxResponseTokens;
|
|
583
631
|
let messages = [];
|
|
584
|
-
if (systemMessage && ["openai", "azure"].indexOf(this._manufacturer.toLowerCase()) > -1) {
|
|
632
|
+
if (systemMessage && ["openai", "azure", "aliyun"].indexOf(this._manufacturer.toLowerCase()) > -1) {
|
|
585
633
|
messages.push({
|
|
586
634
|
role: "system",
|
|
587
635
|
content: systemMessage
|
|
588
636
|
});
|
|
589
637
|
}
|
|
590
638
|
const systemMessageOffset = messages.length;
|
|
591
|
-
const userMessage = ["baidu", "azure", "zhipu", "xunfei"].indexOf(this._manufacturer.toLowerCase()) > -1 ? [{ role: "user", content: text }] : [{ role: "user", content: text, name: opts.name }];
|
|
639
|
+
const userMessage = ["baidu", "azure", "zhipu", "xunfei", "aliyun", "tencent"].indexOf(this._manufacturer.toLowerCase()) > -1 ? [{ role: "user", content: text }] : [{ role: "user", content: text, name: opts.name }];
|
|
592
640
|
let nextMessages = text ? messages.concat(userMessage) : messages;
|
|
593
641
|
let numTokens = 0;
|
|
594
642
|
do {
|
|
@@ -623,7 +671,7 @@ ${message.content}`]);
|
|
|
623
671
|
break;
|
|
624
672
|
}
|
|
625
673
|
const parentMessageRole = parentMessage.role || "user";
|
|
626
|
-
const parentMessageItem = ["baidu", "azure", "zhipu", "xunfei"].indexOf(this._manufacturer.toLowerCase()) > -1 ? {
|
|
674
|
+
const parentMessageItem = ["baidu", "azure", "zhipu", "xunfei", "aliyun", "tencent"].indexOf(this._manufacturer.toLowerCase()) > -1 ? {
|
|
627
675
|
role: parentMessageRole,
|
|
628
676
|
content: parentMessage.text
|
|
629
677
|
} : {
|
|
@@ -647,28 +695,7 @@ ${message.content}`]);
|
|
|
647
695
|
maxTokens = this._maxModelTokens;
|
|
648
696
|
errorMessage = `${this._manufacturer}\uFF1A\u5F53\u524D\u63D0\u95EE\u4E0A\u4E0B\u6587\u5185\u5BB9\u957F\u5EA6${numTokens}tokns\u8D85\u957F\uFF0C\u8BE5\u6A21\u578B\u6700\u5927\u63D0\u95EE\u957F\u5EA6\u4E3A${this._maxModelTokens}tokens\uFF0C\u8BF7\u5207\u6362\u5176\u4ED6\u589E\u5F3AAI\u6A21\u578B\u6216\u51CF\u5C11\u5B57\u6570\u6216\u8005\u5173\u95ED\u4E0A\u4E0B\u6587\u5386\u53F2\u63D0\u9AD8\u5355\u6B21\u63D0\u95EE\u957F\u5EA6\uFF01`;
|
|
649
697
|
}
|
|
650
|
-
|
|
651
|
-
if (this._manufacturer.toLowerCase() === "aliyun") {
|
|
652
|
-
aliyunMessage = { prompt: "", history: [] };
|
|
653
|
-
let onceMessage = { user: "", bot: "" };
|
|
654
|
-
messages.forEach((item, index) => {
|
|
655
|
-
if (index < messages.length - 1 && index > 1) {
|
|
656
|
-
if (!onceMessage.user || !onceMessage.bot) {
|
|
657
|
-
if (item.role === "user")
|
|
658
|
-
onceMessage.user = item.content;
|
|
659
|
-
if (item.role === "assistant")
|
|
660
|
-
onceMessage.bot = item.content;
|
|
661
|
-
}
|
|
662
|
-
if (onceMessage.user && onceMessage.bot) {
|
|
663
|
-
aliyunMessage.history.push(onceMessage);
|
|
664
|
-
onceMessage = { user: "", bot: "" };
|
|
665
|
-
}
|
|
666
|
-
} else {
|
|
667
|
-
aliyunMessage.prompt = item.content;
|
|
668
|
-
}
|
|
669
|
-
});
|
|
670
|
-
}
|
|
671
|
-
return { messages, aliyunMessage, maxTokens, numTokens, errorMessage };
|
|
698
|
+
return { messages, maxTokens, numTokens, errorMessage };
|
|
672
699
|
}
|
|
673
700
|
async _getTokenCount(text) {
|
|
674
701
|
text = text.replace(/<\|endoftext\|>/g, "");
|
|
@@ -686,14 +713,6 @@ ${message.content}`]);
|
|
|
686
713
|
// src/chatgpt-unofficial-proxy-api.ts
|
|
687
714
|
import pTimeout2 from "p-timeout";
|
|
688
715
|
import { v4 as uuidv42 } from "uuid";
|
|
689
|
-
|
|
690
|
-
// src/utils.ts
|
|
691
|
-
var uuidv4Re = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
692
|
-
function isValidUUIDv4(str) {
|
|
693
|
-
return str && uuidv4Re.test(str);
|
|
694
|
-
}
|
|
695
|
-
|
|
696
|
-
// src/chatgpt-unofficial-proxy-api.ts
|
|
697
716
|
var ChatGPTUnofficialProxyAPI = class {
|
|
698
717
|
/**
|
|
699
718
|
* @param fetch - Optional override for the `fetch` implementation to use. Defaults to the global `fetch` function.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@leikeduntech/leiai-js",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"author": "liuhean",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -41,15 +41,16 @@
|
|
|
41
41
|
"node": ">=14"
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
+
"@leikeduntech/spark-nodejs": "0.3.3",
|
|
44
45
|
"cac": "^6.7.14",
|
|
45
46
|
"conf": "^11.0.1",
|
|
47
|
+
"crypto-js": "^4.1.1",
|
|
46
48
|
"eventsource-parser": "^1.0.0",
|
|
47
49
|
"js-tiktoken": "^1.0.5",
|
|
48
50
|
"keyv": "^4.5.2",
|
|
49
51
|
"p-timeout": "^6.1.1",
|
|
50
52
|
"quick-lru": "^6.1.1",
|
|
51
53
|
"read-pkg-up": "^9.1.0",
|
|
52
|
-
"@leikeduntech/spark-nodejs": "0.3.3",
|
|
53
54
|
"uuid": "^9.0.0"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|