doomiaichat 3.5.0 → 4.0.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/dist/baiduai.d.ts +1 -14
- package/dist/baiduai.js +0 -33
- package/dist/declare.js +1 -1
- package/dist/gptbase.d.ts +10 -10
- package/dist/gptbase.js +59 -0
- package/dist/gptprovider.d.ts +1 -0
- package/dist/gptprovider.js +5 -1
- package/dist/openai.js +7 -2
- package/dist/stabilityai.d.ts +30 -0
- package/dist/stabilityai.js +76 -0
- package/package.json +1 -1
- package/src/baiduai.ts +2 -34
- package/src/declare.ts +1 -1
- package/src/gptbase.ts +10 -10
- package/src/gptprovider.ts +5 -1
- package/src/openai.ts +16 -11
- package/src/stabilityai.ts +82 -0
package/dist/baiduai.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ApiResult, CacheProvider } from "./declare";
|
|
2
2
|
import GptBase from "./gptbase";
|
|
3
3
|
export default class BaiduWenXinAI extends GptBase {
|
|
4
4
|
protected credential: ApiCredential;
|
|
@@ -14,23 +14,10 @@ export default class BaiduWenXinAI extends GptBase {
|
|
|
14
14
|
* 获取调用Api的Token
|
|
15
15
|
*/
|
|
16
16
|
getAccessToken(): Promise<AccessTokenResult>;
|
|
17
|
-
/**
|
|
18
|
-
* 获得文字的向量
|
|
19
|
-
* @param text
|
|
20
|
-
*/
|
|
21
|
-
getTextEmbedding(_text: string, _axiosOption: any): Promise<any>;
|
|
22
17
|
/**
|
|
23
18
|
* 请求GPT接口
|
|
24
19
|
*/
|
|
25
20
|
chatRequest(chatText: string | Array<any>, _paramOption: any, axiosOption?: any): Promise<ApiResult>;
|
|
26
|
-
chatRequestInStream(_chatText: string | any[], _paramOption: any, _attach?: any, _axiosOption?: any): void;
|
|
27
|
-
commentQuestionAnswer(_question: string, _answer: string, _axiosOption: any): Promise<CommentResult>;
|
|
28
|
-
getScentenceEmotional(_s1: string, _axiosOption: any): Promise<EmotionResult>;
|
|
29
|
-
getScentenseSimilarity(_s1: string, _s2: string, _axiosOption: any): Promise<SimilarityResult>;
|
|
30
|
-
getSimilarityContent(_content: string, _count: number, _axiosOption: any): Promise<ChatReponse>;
|
|
31
|
-
getSummaryOfContent(_content: string | any[], _axiosOption: any): Promise<SummaryReponse>;
|
|
32
|
-
generateQuestionsFromContent(_content: string, _count: number, _axiosOption: any): Promise<ChatReponse>;
|
|
33
|
-
generateExaminationPaperFromContent(_content: string, _paperOption: any, _axiosOption: any): Promise<ExaminationPaperResult>;
|
|
34
21
|
}
|
|
35
22
|
export interface AccessTokenResult extends ApiResult {
|
|
36
23
|
'access_token'?: string;
|
package/dist/baiduai.js
CHANGED
|
@@ -53,15 +53,6 @@ class BaiduWenXinAI extends gptbase_1.default {
|
|
|
53
53
|
return { successed: false, error: tokenData.data.msg };
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
|
-
/**
|
|
57
|
-
* 获得文字的向量
|
|
58
|
-
* @param text
|
|
59
|
-
*/
|
|
60
|
-
getTextEmbedding(_text, _axiosOption) {
|
|
61
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
62
|
-
return null;
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
56
|
/**
|
|
66
57
|
* 请求GPT接口
|
|
67
58
|
*/
|
|
@@ -97,29 +88,5 @@ class BaiduWenXinAI extends gptbase_1.default {
|
|
|
97
88
|
}
|
|
98
89
|
});
|
|
99
90
|
}
|
|
100
|
-
chatRequestInStream(_chatText, _paramOption, _attach, _axiosOption) {
|
|
101
|
-
throw new Error("Method not implemented.");
|
|
102
|
-
}
|
|
103
|
-
commentQuestionAnswer(_question, _answer, _axiosOption) {
|
|
104
|
-
throw new Error("Method not implemented.");
|
|
105
|
-
}
|
|
106
|
-
getScentenceEmotional(_s1, _axiosOption) {
|
|
107
|
-
throw new Error("Method not implemented.");
|
|
108
|
-
}
|
|
109
|
-
getScentenseSimilarity(_s1, _s2, _axiosOption) {
|
|
110
|
-
throw new Error("Method not implemented.");
|
|
111
|
-
}
|
|
112
|
-
getSimilarityContent(_content, _count, _axiosOption) {
|
|
113
|
-
throw new Error("Method not implemented.");
|
|
114
|
-
}
|
|
115
|
-
getSummaryOfContent(_content, _axiosOption) {
|
|
116
|
-
throw new Error("Method not implemented.");
|
|
117
|
-
}
|
|
118
|
-
generateQuestionsFromContent(_content, _count, _axiosOption) {
|
|
119
|
-
throw new Error("Method not implemented.");
|
|
120
|
-
}
|
|
121
|
-
generateExaminationPaperFromContent(_content, _paperOption, _axiosOption) {
|
|
122
|
-
throw new Error("Method not implemented.");
|
|
123
|
-
}
|
|
124
91
|
}
|
|
125
92
|
exports.default = BaiduWenXinAI;
|
package/dist/declare.js
CHANGED
package/dist/gptbase.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { EventEmitter } from "events";
|
|
3
|
-
import {
|
|
3
|
+
import { ApiResult } from './declare';
|
|
4
4
|
export default abstract class GptBase extends EventEmitter {
|
|
5
5
|
/**
|
|
6
6
|
* 构造函数
|
|
@@ -10,7 +10,7 @@ export default abstract class GptBase extends EventEmitter {
|
|
|
10
10
|
* 获得文字的向量
|
|
11
11
|
* @param text
|
|
12
12
|
*/
|
|
13
|
-
|
|
13
|
+
getTextEmbedding(_text: string, _axiosOption: any): any;
|
|
14
14
|
/**
|
|
15
15
|
* 自由聊天模式
|
|
16
16
|
* @param chatText
|
|
@@ -24,52 +24,52 @@ export default abstract class GptBase extends EventEmitter {
|
|
|
24
24
|
* @param _paramOption
|
|
25
25
|
* @param axiosOption
|
|
26
26
|
*/
|
|
27
|
-
|
|
27
|
+
chatRequestInStream(_chatText: string | Array<any>, _paramOption: any, _attach?: any, _axiosOption?: any): any;
|
|
28
28
|
/**
|
|
29
29
|
* 点评问题回答的评价
|
|
30
30
|
* @param question 问题题干
|
|
31
31
|
* @param answer 回答内容
|
|
32
32
|
* @param axiosOption
|
|
33
33
|
*/
|
|
34
|
-
|
|
34
|
+
commentQuestionAnswer(_question: string, _answer: string, _axiosOption: any): any;
|
|
35
35
|
/**
|
|
36
36
|
* 获取句子的情感
|
|
37
37
|
* @param s1
|
|
38
38
|
* @param axiosOption
|
|
39
39
|
*/
|
|
40
|
-
|
|
40
|
+
getScentenceEmotional(_s1: string, _axiosOption: any): any;
|
|
41
41
|
/**
|
|
42
42
|
* 获取两段文本的相似度
|
|
43
43
|
* @param s1
|
|
44
44
|
* @param s2
|
|
45
45
|
* @param axiosOption
|
|
46
46
|
*/
|
|
47
|
-
|
|
47
|
+
getScentenseSimilarity(_s1: string, _s2: string, _axiosOption: any): any;
|
|
48
48
|
/**
|
|
49
49
|
* 获取一段文本的相似内容
|
|
50
50
|
* @param content
|
|
51
51
|
* @param count
|
|
52
52
|
* @param axiosOption
|
|
53
53
|
*/
|
|
54
|
-
|
|
54
|
+
getSimilarityContent(_content: string, _count: number, _axiosOption: any): any;
|
|
55
55
|
/**
|
|
56
56
|
* 获取内容的摘要
|
|
57
57
|
* @param content
|
|
58
58
|
* @param axiosOption
|
|
59
59
|
*/
|
|
60
|
-
|
|
60
|
+
getSummaryOfContent(_content: string | Array<any>, _axiosOption: any): any;
|
|
61
61
|
/**
|
|
62
62
|
* 从内容中提取问题和答案及管件子
|
|
63
63
|
* @param content
|
|
64
64
|
* @param count
|
|
65
65
|
* @param axiosOption
|
|
66
66
|
*/
|
|
67
|
-
|
|
67
|
+
generateQuestionsFromContent(_content: string, _count: number, _everyContentLength: number, _axiosOption: any): any;
|
|
68
68
|
/**
|
|
69
69
|
* 从内容中提取单选多选判断填空题
|
|
70
70
|
* @param content
|
|
71
71
|
* @param paperOption
|
|
72
72
|
* @param axiosOption
|
|
73
73
|
*/
|
|
74
|
-
|
|
74
|
+
generateExaminationPaperFromContent(_content: string, _paperOption: any, _everyContentLength: number, _axiosOption: any): any;
|
|
75
75
|
}
|
package/dist/gptbase.js
CHANGED
|
@@ -8,5 +8,64 @@ class GptBase extends events_1.EventEmitter {
|
|
|
8
8
|
constructor() {
|
|
9
9
|
super();
|
|
10
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* 获得文字的向量
|
|
13
|
+
* @param text
|
|
14
|
+
*/
|
|
15
|
+
getTextEmbedding(_text, _axiosOption) { return null; }
|
|
16
|
+
/**
|
|
17
|
+
* 流式的聊天模式
|
|
18
|
+
* @param chatText
|
|
19
|
+
* @param _paramOption
|
|
20
|
+
* @param axiosOption
|
|
21
|
+
*/
|
|
22
|
+
chatRequestInStream(_chatText, _paramOption, _attach, _axiosOption) { return null; }
|
|
23
|
+
/**
|
|
24
|
+
* 点评问题回答的评价
|
|
25
|
+
* @param question 问题题干
|
|
26
|
+
* @param answer 回答内容
|
|
27
|
+
* @param axiosOption
|
|
28
|
+
*/
|
|
29
|
+
commentQuestionAnswer(_question, _answer, _axiosOption) { return null; }
|
|
30
|
+
/**
|
|
31
|
+
* 获取句子的情感
|
|
32
|
+
* @param s1
|
|
33
|
+
* @param axiosOption
|
|
34
|
+
*/
|
|
35
|
+
getScentenceEmotional(_s1, _axiosOption) { return null; }
|
|
36
|
+
/**
|
|
37
|
+
* 获取两段文本的相似度
|
|
38
|
+
* @param s1
|
|
39
|
+
* @param s2
|
|
40
|
+
* @param axiosOption
|
|
41
|
+
*/
|
|
42
|
+
getScentenseSimilarity(_s1, _s2, _axiosOption) { return null; }
|
|
43
|
+
/**
|
|
44
|
+
* 获取一段文本的相似内容
|
|
45
|
+
* @param content
|
|
46
|
+
* @param count
|
|
47
|
+
* @param axiosOption
|
|
48
|
+
*/
|
|
49
|
+
getSimilarityContent(_content, _count, _axiosOption) { return null; }
|
|
50
|
+
/**
|
|
51
|
+
* 获取内容的摘要
|
|
52
|
+
* @param content
|
|
53
|
+
* @param axiosOption
|
|
54
|
+
*/
|
|
55
|
+
getSummaryOfContent(_content, _axiosOption) { return null; }
|
|
56
|
+
/**
|
|
57
|
+
* 从内容中提取问题和答案及管件子
|
|
58
|
+
* @param content
|
|
59
|
+
* @param count
|
|
60
|
+
* @param axiosOption
|
|
61
|
+
*/
|
|
62
|
+
generateQuestionsFromContent(_content, _count, _everyContentLength, _axiosOption) { return null; }
|
|
63
|
+
/**
|
|
64
|
+
* 从内容中提取单选多选判断填空题
|
|
65
|
+
* @param content
|
|
66
|
+
* @param paperOption
|
|
67
|
+
* @param axiosOption
|
|
68
|
+
*/
|
|
69
|
+
generateExaminationPaperFromContent(_content, _paperOption, _everyContentLength, _axiosOption) { return null; }
|
|
11
70
|
}
|
|
12
71
|
exports.default = GptBase;
|
package/dist/gptprovider.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ export declare const GptProviderEnum: {
|
|
|
8
8
|
readonly MICROSOFT: "microsoft";
|
|
9
9
|
readonly BAIDU: "baidu";
|
|
10
10
|
readonly GOOGLE: "google";
|
|
11
|
+
readonly STABILITY: "stability";
|
|
11
12
|
};
|
|
12
13
|
export type GptProviderEnum = typeof GptProviderEnum[keyof typeof GptProviderEnum];
|
|
13
14
|
/**
|
package/dist/gptprovider.js
CHANGED
|
@@ -10,6 +10,7 @@ exports.createGpt = exports.GptProviderEnum = void 0;
|
|
|
10
10
|
*/
|
|
11
11
|
const openai_1 = __importDefault(require("./openai"));
|
|
12
12
|
const azureai_1 = __importDefault(require("./azureai"));
|
|
13
|
+
const stabilityai_1 = __importDefault(require("./stabilityai"));
|
|
13
14
|
const baiduai_1 = __importDefault(require("./baiduai"));
|
|
14
15
|
/**
|
|
15
16
|
* OpenAI/NLP 的服务提供商 OpenAI,微软,百度文心(待接入),google(待接入)
|
|
@@ -18,7 +19,8 @@ exports.GptProviderEnum = {
|
|
|
18
19
|
OPENAI: 'openai',
|
|
19
20
|
MICROSOFT: 'microsoft',
|
|
20
21
|
BAIDU: 'baidu',
|
|
21
|
-
GOOGLE: 'google'
|
|
22
|
+
GOOGLE: 'google',
|
|
23
|
+
STABILITY: 'stability'
|
|
22
24
|
};
|
|
23
25
|
/**
|
|
24
26
|
* 根据类型创建不同的TTS引擎对象
|
|
@@ -37,6 +39,8 @@ function createGpt(provider, apikey, setting) {
|
|
|
37
39
|
case exports.GptProviderEnum.BAIDU:
|
|
38
40
|
let cred = typeof (apikey) === 'string' ? { apikey, securitykey: apikey } : apikey;
|
|
39
41
|
return new baiduai_1.default(cred);
|
|
42
|
+
case exports.GptProviderEnum.STABILITY:
|
|
43
|
+
return new stabilityai_1.default(apikey + '', { endpoint, engine }, setting);
|
|
40
44
|
default: return null;
|
|
41
45
|
}
|
|
42
46
|
}
|
package/dist/openai.js
CHANGED
|
@@ -131,10 +131,13 @@ class OpenAIGpt extends gptbase_1.default {
|
|
|
131
131
|
let replytext = [];
|
|
132
132
|
response.data.on('data', (data) => {
|
|
133
133
|
const lines = data.toString().split('\n').filter((line) => line.trim() !== '');
|
|
134
|
+
///已经返回了结束原因
|
|
135
|
+
if (finishreason)
|
|
136
|
+
return;
|
|
134
137
|
for (const line of lines) {
|
|
135
138
|
const message = line.replace(/^data: /, '');
|
|
136
139
|
if (message === '[DONE]') {
|
|
137
|
-
let output = { successed: true, requestid, text: replytext.join(''), finish_reason:
|
|
140
|
+
let output = { successed: true, requestid, text: replytext.join(''), finish_reason: 'stop', usage };
|
|
138
141
|
if (attach)
|
|
139
142
|
output = Object.assign({}, output, attach);
|
|
140
143
|
this.emit('chatdone', output);
|
|
@@ -151,7 +154,9 @@ class OpenAIGpt extends gptbase_1.default {
|
|
|
151
154
|
let output = { successed: true, requestid, text: replytext.join(''), finish_reason: finishreason, index: parsed.choices[0].index, usage };
|
|
152
155
|
if (attach)
|
|
153
156
|
output = Object.assign({}, output, attach);
|
|
154
|
-
this.emit('chattext', output);
|
|
157
|
+
this.emit(finishreason ? 'chatdone' : 'chattext', output);
|
|
158
|
+
if (finishreason)
|
|
159
|
+
return;
|
|
155
160
|
}
|
|
156
161
|
catch (error) {
|
|
157
162
|
this.emit('chaterror', { successed: false, requestid, error: 'JSON parse stream message', message });
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { ApiResult, AzureOpenAIPatameters } from "./declare";
|
|
2
|
+
import GptBase from "./gptbase";
|
|
3
|
+
export default class StabilityAI extends GptBase {
|
|
4
|
+
protected readonly apiKey: string;
|
|
5
|
+
protected readonly apiSetting: AzureOpenAIPatameters;
|
|
6
|
+
protected readonly apiOption: StabilityOption;
|
|
7
|
+
/**
|
|
8
|
+
*
|
|
9
|
+
* @param apiKey 调用OpenAI 的key
|
|
10
|
+
* @param azureOption 用作accesstoken的缓存
|
|
11
|
+
* @param apiOption 用作accesstoken的缓存
|
|
12
|
+
*/
|
|
13
|
+
constructor(apiKey: string, urlOption: AzureOpenAIPatameters, apiOption?: StabilityOption);
|
|
14
|
+
/**
|
|
15
|
+
* 请求Stable作画的接口
|
|
16
|
+
*/
|
|
17
|
+
chatRequest(chatText: string, paramOption: StabilityOption, axiosOption?: any): Promise<StabilityResult>;
|
|
18
|
+
}
|
|
19
|
+
export interface StabilityOption {
|
|
20
|
+
'cfg_scale'?: number;
|
|
21
|
+
'clip_guidance_preset'?: string;
|
|
22
|
+
'height'?: number;
|
|
23
|
+
'width'?: number;
|
|
24
|
+
'samples'?: number;
|
|
25
|
+
'steps'?: number;
|
|
26
|
+
}
|
|
27
|
+
export interface StabilityResult extends ApiResult {
|
|
28
|
+
'data'?: any;
|
|
29
|
+
'type'?: string;
|
|
30
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const declare_1 = require("./declare");
|
|
16
|
+
const gptbase_1 = __importDefault(require("./gptbase"));
|
|
17
|
+
class StabilityAI extends gptbase_1.default {
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
* @param apiKey 调用OpenAI 的key
|
|
21
|
+
* @param azureOption 用作accesstoken的缓存
|
|
22
|
+
* @param apiOption 用作accesstoken的缓存
|
|
23
|
+
*/
|
|
24
|
+
constructor(apiKey, urlOption, apiOption = {}) {
|
|
25
|
+
super();
|
|
26
|
+
this.apiKey = apiKey;
|
|
27
|
+
this.apiSetting = urlOption;
|
|
28
|
+
this.apiOption = apiOption;
|
|
29
|
+
if (!this.apiSetting.endpoint.toLowerCase().startsWith('https://') &&
|
|
30
|
+
!this.apiSetting.endpoint.toLowerCase().startsWith('https://')) {
|
|
31
|
+
this.apiSetting.endpoint = 'https://' + this.apiSetting.endpoint;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 请求Stable作画的接口
|
|
36
|
+
*/
|
|
37
|
+
chatRequest(chatText, paramOption, axiosOption = {}) {
|
|
38
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
39
|
+
if (!chatText)
|
|
40
|
+
return { successed: false, error: { errcode: 2, errmsg: '缺失聊天的内容' } };
|
|
41
|
+
axiosOption = Object.assign({}, axiosOption, {
|
|
42
|
+
headers: {
|
|
43
|
+
"Content-Type": "application/json",
|
|
44
|
+
"Accept": "application/json",
|
|
45
|
+
"Authorization": `Bearer ${this.apiKey}`
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
let param = Object.assign(Object.assign({}, axiosOption), { method: "post", url: `${this.apiSetting.endpoint}/v1/generation/${this.apiSetting.engine}/text-to-image`, data: {
|
|
50
|
+
text_prompts: [
|
|
51
|
+
{
|
|
52
|
+
text: chatText
|
|
53
|
+
}
|
|
54
|
+
],
|
|
55
|
+
cfg_scale: paramOption.cfg_scale || this.apiOption.cfg_scale || 7,
|
|
56
|
+
clip_guidance_preset: paramOption.clip_guidance_preset || this.apiOption.clip_guidance_preset || "FAST_BLUE",
|
|
57
|
+
height: paramOption.height || this.apiOption.height || 512,
|
|
58
|
+
width: paramOption.width || this.apiOption.width || 512,
|
|
59
|
+
samples: paramOption.samples || this.apiOption.samples || 1,
|
|
60
|
+
steps: paramOption.steps || this.apiOption.steps || 30,
|
|
61
|
+
} });
|
|
62
|
+
const response = yield (0, declare_1.request)(param);
|
|
63
|
+
if (response.successed) {
|
|
64
|
+
let data = response.data;
|
|
65
|
+
return { successed: true, type: 'image', data: data.artifacts, };
|
|
66
|
+
}
|
|
67
|
+
return Object.assign({ successed: false }, response.data);
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.log('result is error ', error);
|
|
71
|
+
return { successed: false, error };
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.default = StabilityAI;
|
package/package.json
CHANGED
package/src/baiduai.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ApiResult, CacheProvider, request } from "./declare";
|
|
2
2
|
import GptBase from "./gptbase"
|
|
3
3
|
const TOKEN_CACHE_KEY = "key:_doomisoft:baiduwenxin:"
|
|
4
4
|
export default class BaiduWenXinAI extends GptBase {
|
|
@@ -39,13 +39,7 @@ export default class BaiduWenXinAI extends GptBase {
|
|
|
39
39
|
}
|
|
40
40
|
return { successed: false, error: tokenData.data.msg }
|
|
41
41
|
}
|
|
42
|
-
|
|
43
|
-
* 获得文字的向量
|
|
44
|
-
* @param text
|
|
45
|
-
*/
|
|
46
|
-
async getTextEmbedding(_text: string, _axiosOption: any): Promise<any> {
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
42
|
+
|
|
49
43
|
/**
|
|
50
44
|
* 请求GPT接口
|
|
51
45
|
*/
|
|
@@ -82,32 +76,6 @@ export default class BaiduWenXinAI extends GptBase {
|
|
|
82
76
|
}
|
|
83
77
|
|
|
84
78
|
}
|
|
85
|
-
|
|
86
|
-
chatRequestInStream(_chatText: string | any[], _paramOption: any,_attach?:any, _axiosOption?: any): void {
|
|
87
|
-
throw new Error("Method not implemented.");
|
|
88
|
-
}
|
|
89
|
-
commentQuestionAnswer(_question: string, _answer: string, _axiosOption: any): Promise<CommentResult>{
|
|
90
|
-
throw new Error("Method not implemented.");
|
|
91
|
-
}
|
|
92
|
-
getScentenceEmotional(_s1: string, _axiosOption: any): Promise<EmotionResult> {
|
|
93
|
-
throw new Error("Method not implemented.");
|
|
94
|
-
}
|
|
95
|
-
getScentenseSimilarity(_s1: string, _s2: string, _axiosOption: any): Promise<SimilarityResult> {
|
|
96
|
-
throw new Error("Method not implemented.");
|
|
97
|
-
}
|
|
98
|
-
getSimilarityContent(_content: string, _count: number, _axiosOption: any): Promise<ChatReponse> {
|
|
99
|
-
throw new Error("Method not implemented.");
|
|
100
|
-
}
|
|
101
|
-
getSummaryOfContent(_content: string | any[], _axiosOption: any): Promise<SummaryReponse> {
|
|
102
|
-
throw new Error("Method not implemented.");
|
|
103
|
-
}
|
|
104
|
-
generateQuestionsFromContent(_content: string, _count: number, _axiosOption: any): Promise<ChatReponse> {
|
|
105
|
-
throw new Error("Method not implemented.");
|
|
106
|
-
}
|
|
107
|
-
generateExaminationPaperFromContent(_content: string, _paperOption: any, _axiosOption: any): Promise<ExaminationPaperResult> {
|
|
108
|
-
throw new Error("Method not implemented.");
|
|
109
|
-
}
|
|
110
|
-
|
|
111
79
|
}
|
|
112
80
|
export interface AccessTokenResult extends ApiResult {
|
|
113
81
|
'access_token'?: string
|
package/src/declare.ts
CHANGED
|
@@ -139,7 +139,7 @@ export async function request(opts: any = {}): Promise<RpcResult> {
|
|
|
139
139
|
let result = await axios(opts);
|
|
140
140
|
return { successed: true, data: result.data }
|
|
141
141
|
} catch (err) {
|
|
142
|
-
return { successed: false, error: err }
|
|
142
|
+
return { successed: false, error: err,data:err }
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
|
package/src/gptbase.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EventEmitter } from "events"
|
|
2
|
-
import {
|
|
2
|
+
import { ApiResult } from './declare'
|
|
3
3
|
|
|
4
4
|
export default abstract class GptBase extends EventEmitter {
|
|
5
5
|
/**
|
|
@@ -12,7 +12,7 @@ export default abstract class GptBase extends EventEmitter {
|
|
|
12
12
|
* 获得文字的向量
|
|
13
13
|
* @param text
|
|
14
14
|
*/
|
|
15
|
-
|
|
15
|
+
getTextEmbedding(_text: string, _axiosOption: any):any {return null;}
|
|
16
16
|
/**
|
|
17
17
|
* 自由聊天模式
|
|
18
18
|
* @param chatText
|
|
@@ -26,52 +26,52 @@ export default abstract class GptBase extends EventEmitter {
|
|
|
26
26
|
* @param _paramOption
|
|
27
27
|
* @param axiosOption
|
|
28
28
|
*/
|
|
29
|
-
|
|
29
|
+
chatRequestInStream(_chatText: string | Array<any>, _paramOption: any, _attach?: any, _axiosOption?: any): any { return null; }
|
|
30
30
|
/**
|
|
31
31
|
* 点评问题回答的评价
|
|
32
32
|
* @param question 问题题干
|
|
33
33
|
* @param answer 回答内容
|
|
34
34
|
* @param axiosOption
|
|
35
35
|
*/
|
|
36
|
-
|
|
36
|
+
commentQuestionAnswer(_question: string, _answer: string, _axiosOption: any): any { return null; }
|
|
37
37
|
/**
|
|
38
38
|
* 获取句子的情感
|
|
39
39
|
* @param s1
|
|
40
40
|
* @param axiosOption
|
|
41
41
|
*/
|
|
42
|
-
|
|
42
|
+
getScentenceEmotional(_s1: string, _axiosOption: any): any { return null; }
|
|
43
43
|
/**
|
|
44
44
|
* 获取两段文本的相似度
|
|
45
45
|
* @param s1
|
|
46
46
|
* @param s2
|
|
47
47
|
* @param axiosOption
|
|
48
48
|
*/
|
|
49
|
-
|
|
49
|
+
getScentenseSimilarity(_s1: string, _s2: string, _axiosOption: any): any { return null; }
|
|
50
50
|
/**
|
|
51
51
|
* 获取一段文本的相似内容
|
|
52
52
|
* @param content
|
|
53
53
|
* @param count
|
|
54
54
|
* @param axiosOption
|
|
55
55
|
*/
|
|
56
|
-
|
|
56
|
+
getSimilarityContent(_content: string, _count: number, _axiosOption: any): any { return null; }
|
|
57
57
|
/**
|
|
58
58
|
* 获取内容的摘要
|
|
59
59
|
* @param content
|
|
60
60
|
* @param axiosOption
|
|
61
61
|
*/
|
|
62
|
-
|
|
62
|
+
getSummaryOfContent(_content: string | Array<any>, _axiosOption: any): any { return null; }
|
|
63
63
|
/**
|
|
64
64
|
* 从内容中提取问题和答案及管件子
|
|
65
65
|
* @param content
|
|
66
66
|
* @param count
|
|
67
67
|
* @param axiosOption
|
|
68
68
|
*/
|
|
69
|
-
|
|
69
|
+
generateQuestionsFromContent(_content: string, _count: number, _everyContentLength: number, _axiosOption: any): any { return null; }
|
|
70
70
|
/**
|
|
71
71
|
* 从内容中提取单选多选判断填空题
|
|
72
72
|
* @param content
|
|
73
73
|
* @param paperOption
|
|
74
74
|
* @param axiosOption
|
|
75
75
|
*/
|
|
76
|
-
|
|
76
|
+
generateExaminationPaperFromContent(_content: string, _paperOption: any, _everyContentLength: number, _axiosOption: any): any { return null; }
|
|
77
77
|
}
|
package/src/gptprovider.ts
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import OpenAIGpt from './openai';
|
|
6
6
|
import AzureAI from './azureai'
|
|
7
|
+
import StabilityAI from './stabilityai'
|
|
7
8
|
import BaiduWenXinAI, { ApiCredential } from './baiduai'
|
|
8
9
|
import GptBase from './gptbase';
|
|
9
10
|
/**
|
|
@@ -13,7 +14,8 @@ export const GptProviderEnum = {
|
|
|
13
14
|
OPENAI: 'openai',
|
|
14
15
|
MICROSOFT: 'microsoft',
|
|
15
16
|
BAIDU: 'baidu',
|
|
16
|
-
GOOGLE:'google'
|
|
17
|
+
GOOGLE:'google',
|
|
18
|
+
STABILITY:'stability'
|
|
17
19
|
} as const;
|
|
18
20
|
export type GptProviderEnum = typeof GptProviderEnum[keyof typeof GptProviderEnum];
|
|
19
21
|
/**
|
|
@@ -33,6 +35,8 @@ export function createGpt(provider: GptProviderEnum, apikey: string|ApiCredentia
|
|
|
33
35
|
case GptProviderEnum.BAIDU:
|
|
34
36
|
let cred: ApiCredential = typeof (apikey) === 'string' ? { apikey, securitykey: apikey } : apikey
|
|
35
37
|
return new BaiduWenXinAI(cred);
|
|
38
|
+
case GptProviderEnum.STABILITY:
|
|
39
|
+
return new StabilityAI(apikey + '', { endpoint, engine }, setting);
|
|
36
40
|
default: return null;
|
|
37
41
|
}
|
|
38
42
|
};
|
package/src/openai.ts
CHANGED
|
@@ -46,7 +46,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
46
46
|
* 获得文字的向量
|
|
47
47
|
* @param text
|
|
48
48
|
*/
|
|
49
|
-
async getTextEmbedding(text: string, axiosOption: any): Promise<EmbeddingResult>{
|
|
49
|
+
override async getTextEmbedding(text: string, axiosOption: any): Promise<EmbeddingResult>{
|
|
50
50
|
if (!text) return { successed: false, error: { errcode: 2, errmsg: 'content required' } };
|
|
51
51
|
if (!this.aiApi) {
|
|
52
52
|
this.aiApi = this.createOpenAI(this.apiKey);
|
|
@@ -97,7 +97,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
97
97
|
* @param _paramOption
|
|
98
98
|
* @param axiosOption
|
|
99
99
|
*/
|
|
100
|
-
async chatRequestInStream(chatText: string | Array<any>, callChatOption: OpenAIApiParameters, attach?: any, axiosOption?: any):Promise<any>{
|
|
100
|
+
override async chatRequestInStream(chatText: string | Array<any>, callChatOption: OpenAIApiParameters, attach?: any, axiosOption?: any):Promise<any>{
|
|
101
101
|
if (!chatText) this.emit('chaterror', { successed: false, error:'no text in chat'});
|
|
102
102
|
if (!this.aiApi) {
|
|
103
103
|
this.aiApi = this.createOpenAI(this.apiKey);
|
|
@@ -118,12 +118,16 @@ export default class OpenAIGpt extends GptBase {
|
|
|
118
118
|
max_tokens: Number(callChatOption?.maxtoken || this.maxtoken)
|
|
119
119
|
}, axiosOption);
|
|
120
120
|
let replytext:string[] = [];
|
|
121
|
+
|
|
121
122
|
response.data.on('data', (data:any) => {
|
|
122
123
|
const lines = data.toString().split('\n').filter((line:string) => line.trim() !== '');
|
|
124
|
+
///已经返回了结束原因
|
|
125
|
+
if (finishreason) return;
|
|
123
126
|
for (const line of lines) {
|
|
127
|
+
|
|
124
128
|
const message = line.replace(/^data: /, '');
|
|
125
129
|
if (message === '[DONE]') {
|
|
126
|
-
let output = { successed: true, requestid, text: replytext.join(''), finish_reason:
|
|
130
|
+
let output = { successed: true, requestid, text: replytext.join(''), finish_reason: 'stop', usage };
|
|
127
131
|
if (attach) output = Object.assign({},output, attach);
|
|
128
132
|
this.emit('chatdone', output)
|
|
129
133
|
return; // Stream finished
|
|
@@ -138,7 +142,8 @@ export default class OpenAIGpt extends GptBase {
|
|
|
138
142
|
replytext.push(streamtext);
|
|
139
143
|
let output = { successed: true, requestid, text: replytext.join(''), finish_reason: finishreason, index: parsed.choices[0].index, usage };
|
|
140
144
|
if (attach) output = Object.assign({},output, attach);
|
|
141
|
-
this.emit('chattext', output )
|
|
145
|
+
this.emit(finishreason ? 'chatdone':'chattext', output )
|
|
146
|
+
if (finishreason) return;
|
|
142
147
|
} catch (error) {
|
|
143
148
|
this.emit('chaterror', { successed: false, requestid, error: 'JSON parse stream message', message });
|
|
144
149
|
}
|
|
@@ -157,7 +162,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
157
162
|
* @param answer
|
|
158
163
|
* @param axiosOption
|
|
159
164
|
*/
|
|
160
|
-
async commentQuestionAnswer(question: string, answer: string, axiosOption: any = { timeout: 30000 }): Promise<CommentResult>{
|
|
165
|
+
override async commentQuestionAnswer(question: string, answer: string, axiosOption: any = { timeout: 30000 }): Promise<CommentResult>{
|
|
161
166
|
if (!question || !answer) return { successed: false, error: { errcode: 2, errmsg: '缺失参数' } }
|
|
162
167
|
let message = [
|
|
163
168
|
{role:'system',content:'你是一名专业的知识点评师。'},
|
|
@@ -187,7 +192,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
187
192
|
* @param {*} s1
|
|
188
193
|
* @param {*} axiosOption
|
|
189
194
|
*/
|
|
190
|
-
async getScentenceEmotional(s1: string, axiosOption: any = { timeout: 30000 }): Promise<EmotionResult> {
|
|
195
|
+
override async getScentenceEmotional(s1: string, axiosOption: any = { timeout: 30000 }): Promise<EmotionResult> {
|
|
191
196
|
if (!s1) return { successed: false, error: { errcode: 2, errmsg: '缺失参数' } }
|
|
192
197
|
const emotion = ['愤怒', '威胁', '讽刺', '愧疚', '兴奋', '友好', '消极', '生气', '正常'];
|
|
193
198
|
const messages = [
|
|
@@ -210,7 +215,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
210
215
|
* @param {*} s1
|
|
211
216
|
* @param {*} s2
|
|
212
217
|
*/
|
|
213
|
-
async getScentenseSimilarity(s1: string, s2: string, axiosOption: any = { timeout: 30000 }): Promise<SimilarityResult> {
|
|
218
|
+
override async getScentenseSimilarity(s1: string, s2: string, axiosOption: any = { timeout: 30000 }): Promise<SimilarityResult> {
|
|
214
219
|
if (!s1 || !s2) return { successed: false, error: { errcode: 2, errmsg: '缺失参数' } }
|
|
215
220
|
const messages = [
|
|
216
221
|
{ role: 'system', content: '你是一名专业的语言分析大师' },
|
|
@@ -238,7 +243,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
238
243
|
* @param {*} content
|
|
239
244
|
* @param {需要出来的数量} count
|
|
240
245
|
*/
|
|
241
|
-
async getSimilarityContent(content: string, count: number = 1, axiosOption: any = {}): Promise<ChatReponse> {
|
|
246
|
+
override async getSimilarityContent(content: string, count: number = 1, axiosOption: any = {}): Promise<ChatReponse> {
|
|
242
247
|
let chnReg: boolean = /([\u4e00-\u9fa5]|[\ufe30-\uffa0])/.test(content) ///检查源话是否含有中文内容
|
|
243
248
|
let engReg: boolean = /[a-zA-Z]/.test(content) ///检查源话是否含有英文内容
|
|
244
249
|
///如果源话是全中文,那么结果中不应该出来英文的相似说法,如果源话是全英文,则结果不能出现全中文的说法
|
|
@@ -254,7 +259,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
254
259
|
* @param content
|
|
255
260
|
* @param axiosOption
|
|
256
261
|
*/
|
|
257
|
-
async getSummaryOfContent(content: string | Array<any>, axiosOption: any = {}): Promise<SummaryReponse> {
|
|
262
|
+
override async getSummaryOfContent(content: string | Array<any>, axiosOption: any = {}): Promise<SummaryReponse> {
|
|
258
263
|
const arrContent = typeof (content) == 'string' ? this.splitLongText(content) : content;
|
|
259
264
|
let summary: Array<OutlineSummaryItem> = [];
|
|
260
265
|
while (arrContent.length > 0) {
|
|
@@ -282,7 +287,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
282
287
|
* @param {*} axiosOption
|
|
283
288
|
* @returns
|
|
284
289
|
*///并在答案末尾处必须给出答案内容中的关键词
|
|
285
|
-
async generateQuestionsFromContent(content: string, count: number = 1, everyContentLength: number = SECTION_LENGTH, axiosOption: any = {}): Promise<ChatReponse> {
|
|
290
|
+
override async generateQuestionsFromContent(content: string, count: number = 1, everyContentLength: number = SECTION_LENGTH, axiosOption: any = {}): Promise<ChatReponse> {
|
|
286
291
|
let arrContent = this.splitLongText(content, everyContentLength || SECTION_LENGTH);
|
|
287
292
|
///没20句话分为一组,适应大文件内容多次请求组合结果
|
|
288
293
|
///每一句话需要产生的题目
|
|
@@ -364,7 +369,7 @@ export default class OpenAIGpt extends GptBase {
|
|
|
364
369
|
* @param {*} axiosOption
|
|
365
370
|
* @returns
|
|
366
371
|
*///并在答案末尾处必须给出答案内容中的关键词
|
|
367
|
-
async generateExaminationPaperFromContent(content: string, paperOption: any = {}, everyContentLength: number = SECTION_LENGTH, axiosOption: any = {}): Promise<ExaminationPaperResult> {
|
|
372
|
+
override async generateExaminationPaperFromContent(content: string, paperOption: any = {}, everyContentLength: number = SECTION_LENGTH, axiosOption: any = {}): Promise<ExaminationPaperResult> {
|
|
368
373
|
let arrContent = this.splitLongText(content, everyContentLength || SECTION_LENGTH);
|
|
369
374
|
let sectionCount: any = {
|
|
370
375
|
singlechoice: (paperOption.singlechoice?.count || 0) / arrContent.length,
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ApiResult, request, AzureOpenAIPatameters } from "./declare";
|
|
2
|
+
import GptBase from "./gptbase"
|
|
3
|
+
export default class StabilityAI extends GptBase {
|
|
4
|
+
|
|
5
|
+
protected readonly apiKey: string;
|
|
6
|
+
protected readonly apiSetting: AzureOpenAIPatameters
|
|
7
|
+
protected readonly apiOption:StabilityOption;
|
|
8
|
+
/**
|
|
9
|
+
*
|
|
10
|
+
* @param apiKey 调用OpenAI 的key
|
|
11
|
+
* @param azureOption 用作accesstoken的缓存
|
|
12
|
+
* @param apiOption 用作accesstoken的缓存
|
|
13
|
+
*/
|
|
14
|
+
constructor(apiKey: string, urlOption: AzureOpenAIPatameters, apiOption: StabilityOption = {}) {
|
|
15
|
+
super();
|
|
16
|
+
this.apiKey = apiKey;
|
|
17
|
+
this.apiSetting = urlOption;
|
|
18
|
+
this.apiOption = apiOption;
|
|
19
|
+
if (!this.apiSetting.endpoint.toLowerCase().startsWith('https://') &&
|
|
20
|
+
!this.apiSetting.endpoint.toLowerCase().startsWith('https://')) {
|
|
21
|
+
this.apiSetting.endpoint = 'https://' + this.apiSetting.endpoint;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 请求Stable作画的接口
|
|
26
|
+
*/
|
|
27
|
+
public async chatRequest(chatText: string, paramOption: StabilityOption, axiosOption: any = {}): Promise<StabilityResult> {
|
|
28
|
+
if (!chatText) return { successed: false, error: { errcode: 2, errmsg: '缺失聊天的内容' } };
|
|
29
|
+
axiosOption = Object.assign({}, axiosOption,{
|
|
30
|
+
headers:{
|
|
31
|
+
"Content-Type": "application/json",
|
|
32
|
+
"Accept": "application/json",
|
|
33
|
+
"Authorization": `Bearer ${this.apiKey}`
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
try {
|
|
37
|
+
let param = {
|
|
38
|
+
...axiosOption,
|
|
39
|
+
method: "post",
|
|
40
|
+
url: `${this.apiSetting.endpoint}/v1/generation/${this.apiSetting.engine}/text-to-image`,
|
|
41
|
+
data: {
|
|
42
|
+
text_prompts: [
|
|
43
|
+
{
|
|
44
|
+
text: chatText
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
cfg_scale: paramOption.cfg_scale || this.apiOption.cfg_scale || 7,
|
|
48
|
+
clip_guidance_preset: paramOption.clip_guidance_preset || this.apiOption.clip_guidance_preset || "FAST_BLUE",
|
|
49
|
+
height: paramOption.height || this.apiOption.height || 512,
|
|
50
|
+
width: paramOption.width || this.apiOption.width || 512,
|
|
51
|
+
samples: paramOption.samples || this.apiOption.samples || 1,
|
|
52
|
+
steps: paramOption.steps || this.apiOption.steps || 30,
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
};
|
|
56
|
+
const response:any = await request(param)
|
|
57
|
+
if (response.successed) {
|
|
58
|
+
let data = response.data;
|
|
59
|
+
return { successed: true, type: 'image', data: data.artifacts, };
|
|
60
|
+
}
|
|
61
|
+
return { successed: false, ...response.data };
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.log('result is error ', error)
|
|
64
|
+
return { successed: false, error };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface StabilityOption {
|
|
71
|
+
'cfg_scale'?: number,
|
|
72
|
+
'clip_guidance_preset'?: string,
|
|
73
|
+
'height'?: number,
|
|
74
|
+
'width'?: number,
|
|
75
|
+
'samples'?: number,
|
|
76
|
+
'steps'?: number,
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface StabilityResult extends ApiResult {
|
|
80
|
+
'data'?:any;
|
|
81
|
+
'type'?:string;
|
|
82
|
+
}
|