@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 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, aliyunMessage, maxTokens, numTokens, errorMessage } = await this._buildMessages(
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 _a, _b, _c, _d, _e;
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 (${url}`);
303
- console.log(`api header (${JSON.stringify(headers)}`);
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 : `, aliyunMessage || messages);
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 _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _i, _j, _k;
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 (((_a2 = response.choices[0]) == null ? void 0 : _a2.finish_reason) === "stop") {
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) === "stop") {
376
- result.text = response == null ? void 0 : response.output.text.trim();
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 (((_c2 = response.choices) == null ? void 0 : _c2.length) && ["openai", "azure"].indexOf(this._manufacturer.toLowerCase()) > -1) {
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: (_d2 = response.usage) == null ? void 0 : _d2.input_tokens, completion_tokens: (_e2 = response.usage) == null ? void 0 : _e2.output_tokens, total_tokens: ((_f = response.usage) == null ? void 0 : _f.input_tokens) + ((_g = response.usage) == null ? void 0 : _g.output_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 ((_h = response == null ? void 0 : response.output) == null ? void 0 : _h.text)
415
- result.text = (_i = response == null ? void 0 : response.output) == null ? void 0 : _i.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 ((_j = response == null ? void 0 : response.meta) == null ? void 0 : _j.usage) {
422
- response.usage = (_k = response == null ? void 0 : response.meta) == null ? void 0 : _k.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 (((_a = response == null ? void 0 : response.choices) == null ? void 0 : _a.length) && ["openai", "azure"].indexOf(this._manufacturer.toLowerCase()) > -1) {
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 _a, _b;
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 = (_a = message2.detail) == null ? void 0 : _a.usage) == null ? void 0 : _b.total_tokens;
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
- let aliyunMessage;
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.6",
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": {