wtfai 1.0.0 → 1.0.1
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/README.md +21 -7
- package/dist/client.d.ts +2 -2
- package/dist/client.js +27 -17
- package/dist/index.d.ts +1 -1
- package/dist/session.js +36 -20
- package/dist/sse.js +18 -9
- package/dist/types.d.ts +8 -1
- package/dist/upload.d.ts +2 -2
- package/dist/upload.js +19 -8
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -10,6 +10,16 @@ npm install wtfai
|
|
|
10
10
|
pnpm add wtfai
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
+
## 使用前准备
|
|
14
|
+
|
|
15
|
+
- 前往 `https://www.ourteacher.cc/` 联系客服申请开通 API 访问权限,获取 API Key;
|
|
16
|
+
|
|
17
|
+
- 您的后端需要代理 `https://llm-api.ourschool.cc/workflows/` 开头的接口,在代理过程中需要给请求头添加 `x-tenant-secret`,值为 API Key;
|
|
18
|
+
|
|
19
|
+
- 后续将 `baseUrl` 改为您的后端代理地址即可;
|
|
20
|
+
|
|
21
|
+
- 为方便开发调试,前端可以在创建 Wtfai 实例时传入 `tenantSecret`,值为 API Key,切记不要在生产环境使用。
|
|
22
|
+
|
|
13
23
|
## 快速开始
|
|
14
24
|
|
|
15
25
|
```typescript
|
|
@@ -232,16 +242,20 @@ const url = await client.upload.uploadFile({
|
|
|
232
242
|
})
|
|
233
243
|
```
|
|
234
244
|
|
|
235
|
-
##### `uploadImage(
|
|
245
|
+
##### `uploadImage(params)`
|
|
236
246
|
|
|
237
247
|
上传图片(自动压缩)。
|
|
238
248
|
|
|
239
249
|
```typescript
|
|
240
|
-
const url = await client.upload.uploadImage(
|
|
241
|
-
imageFile,
|
|
242
|
-
'conversation',
|
|
243
|
-
(percent) => console.log(`${percent * 100}%`),
|
|
244
|
-
|
|
250
|
+
const url = await client.upload.uploadImage({
|
|
251
|
+
file: imageFile,
|
|
252
|
+
resourceType: 'conversation',
|
|
253
|
+
onProgress: (percent) => console.log(`${percent * 100}%`),
|
|
254
|
+
compressOptions: { // 可选
|
|
255
|
+
quality: 0.8,
|
|
256
|
+
maxWidth: 1920,
|
|
257
|
+
},
|
|
258
|
+
})
|
|
245
259
|
```
|
|
246
260
|
|
|
247
261
|
---
|
|
@@ -304,7 +318,7 @@ interface SendInput {
|
|
|
304
318
|
import { useState, useEffect, useRef } from 'react'
|
|
305
319
|
import Wtfai, { type SimpleMessage, type WorkflowSession } from 'wtfai'
|
|
306
320
|
|
|
307
|
-
const client = new
|
|
321
|
+
const client = new Wtfai({
|
|
308
322
|
baseUrl: 'https://api.example.com',
|
|
309
323
|
})
|
|
310
324
|
|
package/dist/client.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Workflow, WorkflowListResponse } from '@our-llm/shared/workflow.types';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ClientConfig, SessionOptions } from './types';
|
|
3
3
|
import { WorkflowSession } from './session';
|
|
4
4
|
import { UploadService } from './upload';
|
|
5
5
|
/**
|
|
@@ -39,7 +39,7 @@ export declare class Wtfai {
|
|
|
39
39
|
*/
|
|
40
40
|
readonly upload: UploadService;
|
|
41
41
|
private readonly headers;
|
|
42
|
-
constructor(config:
|
|
42
|
+
constructor(config: ClientConfig);
|
|
43
43
|
/**
|
|
44
44
|
* 获取工作流列表
|
|
45
45
|
*/
|
package/dist/client.js
CHANGED
|
@@ -1,23 +1,16 @@
|
|
|
1
1
|
import { WorkflowSession } from "./session.js";
|
|
2
2
|
import { UploadService } from "./upload.js";
|
|
3
|
+
function _define_property(obj, key, value) {
|
|
4
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
5
|
+
value: value,
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
writable: true
|
|
9
|
+
});
|
|
10
|
+
else obj[key] = value;
|
|
11
|
+
return obj;
|
|
12
|
+
}
|
|
3
13
|
class Wtfai {
|
|
4
|
-
baseUrl;
|
|
5
|
-
uploadService;
|
|
6
|
-
upload;
|
|
7
|
-
headers;
|
|
8
|
-
constructor(config){
|
|
9
|
-
this.baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
10
|
-
const headers = {
|
|
11
|
-
...config.headers
|
|
12
|
-
};
|
|
13
|
-
if (config.tenantSecret) {
|
|
14
|
-
console.warn('%c[OurLLM SDK] ⚠️ Warning: tenantSecret is provided. This should ONLY be used for debugging purposes. DO NOT use in production.', 'color: red; font-weight: bold; font-size: 14px;');
|
|
15
|
-
headers['x-tenant-secret'] = config.tenantSecret;
|
|
16
|
-
}
|
|
17
|
-
this.headers = headers;
|
|
18
|
-
this.uploadService = new UploadService(this.baseUrl, this.headers);
|
|
19
|
-
this.upload = this.uploadService;
|
|
20
|
-
}
|
|
21
14
|
async getWorkflows(page = 1, pageSize = 10) {
|
|
22
15
|
const params = new URLSearchParams({
|
|
23
16
|
current: String(page),
|
|
@@ -39,5 +32,22 @@ class Wtfai {
|
|
|
39
32
|
createSession(workflowId, options) {
|
|
40
33
|
return new WorkflowSession(workflowId, this.baseUrl, this.uploadService, this.headers, options);
|
|
41
34
|
}
|
|
35
|
+
constructor(config){
|
|
36
|
+
_define_property(this, "baseUrl", void 0);
|
|
37
|
+
_define_property(this, "uploadService", void 0);
|
|
38
|
+
_define_property(this, "upload", void 0);
|
|
39
|
+
_define_property(this, "headers", void 0);
|
|
40
|
+
this.baseUrl = config.baseUrl.replace(/\/$/, '');
|
|
41
|
+
const headers = {
|
|
42
|
+
...config.headers
|
|
43
|
+
};
|
|
44
|
+
if (config.tenantSecret) {
|
|
45
|
+
console.warn('%c[OurLLM SDK] ⚠️ Warning: tenantSecret is provided. This should ONLY be used for debugging purposes. DO NOT use in production.', 'color: red; font-weight: bold; font-size: 14px;');
|
|
46
|
+
headers['x-tenant-secret'] = config.tenantSecret;
|
|
47
|
+
}
|
|
48
|
+
this.headers = headers;
|
|
49
|
+
this.uploadService = new UploadService(this.baseUrl, this.headers);
|
|
50
|
+
this.upload = this.uploadService;
|
|
51
|
+
}
|
|
42
52
|
}
|
|
43
53
|
export { Wtfai };
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,6 @@ import { Wtfai } from './client';
|
|
|
2
2
|
export default Wtfai;
|
|
3
3
|
export { WorkflowSession } from './session';
|
|
4
4
|
export { UploadService } from './upload';
|
|
5
|
-
export type {
|
|
5
|
+
export type { ClientConfig, SessionOptions, SessionState, SessionEventListeners, SendInput, UploadParams, UploadImageParams, CompressOptions, WorkflowInfo, } from './types';
|
|
6
6
|
export type { SimpleMessage } from '@our-llm/shared/workflow-events';
|
|
7
7
|
export type { Workflow, WorkflowConfig } from '@our-llm/shared/workflow.types';
|
package/dist/session.js
CHANGED
|
@@ -1,31 +1,24 @@
|
|
|
1
1
|
import { executeWorkflowSSE } from "./sse.js";
|
|
2
2
|
import { v7 } from "uuid";
|
|
3
|
+
function _define_property(obj, key, value) {
|
|
4
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
5
|
+
value: value,
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
writable: true
|
|
9
|
+
});
|
|
10
|
+
else obj[key] = value;
|
|
11
|
+
return obj;
|
|
12
|
+
}
|
|
3
13
|
class WorkflowSession {
|
|
4
|
-
workflowId;
|
|
5
|
-
baseUrl;
|
|
6
|
-
uploadService;
|
|
7
|
-
headers;
|
|
8
|
-
state = {
|
|
9
|
-
messages: [],
|
|
10
|
-
isExecuting: false
|
|
11
|
-
};
|
|
12
|
-
listeners = new Map();
|
|
13
|
-
abortController;
|
|
14
|
-
constructor(workflowId, baseUrl, uploadService, headers = {}, options = {}){
|
|
15
|
-
this.workflowId = workflowId;
|
|
16
|
-
this.baseUrl = baseUrl;
|
|
17
|
-
this.uploadService = uploadService;
|
|
18
|
-
this.headers = headers;
|
|
19
|
-
if (options.threadId) this.state.threadId = options.threadId;
|
|
20
|
-
else this.state.threadId = v7();
|
|
21
|
-
}
|
|
22
14
|
on(event, listener) {
|
|
23
15
|
if (!this.listeners.has(event)) this.listeners.set(event, new Set());
|
|
24
16
|
this.listeners.get(event).add(listener);
|
|
25
17
|
return this;
|
|
26
18
|
}
|
|
27
19
|
off(event, listener) {
|
|
28
|
-
|
|
20
|
+
var _this_listeners_get;
|
|
21
|
+
null == (_this_listeners_get = this.listeners.get(event)) || _this_listeners_get.delete(listener);
|
|
29
22
|
return this;
|
|
30
23
|
}
|
|
31
24
|
emit(event, ...args) {
|
|
@@ -72,7 +65,10 @@ class WorkflowSession {
|
|
|
72
65
|
text: input.content
|
|
73
66
|
});
|
|
74
67
|
if (input.images && input.images.length > 0) {
|
|
75
|
-
const imageUrls = await Promise.all(input.images.map((file)=>this.uploadService.uploadImage(
|
|
68
|
+
const imageUrls = await Promise.all(input.images.map((file)=>this.uploadService.uploadImage({
|
|
69
|
+
file,
|
|
70
|
+
resourceType: 'conversation'
|
|
71
|
+
})));
|
|
76
72
|
for (const url of imageUrls)contentParts.push({
|
|
77
73
|
type: 'image',
|
|
78
74
|
url
|
|
@@ -241,5 +237,25 @@ class WorkflowSession {
|
|
|
241
237
|
});
|
|
242
238
|
}
|
|
243
239
|
}
|
|
240
|
+
constructor(workflowId, baseUrl, uploadService, headers = {}, options = {}){
|
|
241
|
+
_define_property(this, "workflowId", void 0);
|
|
242
|
+
_define_property(this, "baseUrl", void 0);
|
|
243
|
+
_define_property(this, "uploadService", void 0);
|
|
244
|
+
_define_property(this, "headers", void 0);
|
|
245
|
+
_define_property(this, "state", void 0);
|
|
246
|
+
_define_property(this, "listeners", void 0);
|
|
247
|
+
_define_property(this, "abortController", void 0);
|
|
248
|
+
this.workflowId = workflowId;
|
|
249
|
+
this.baseUrl = baseUrl;
|
|
250
|
+
this.uploadService = uploadService;
|
|
251
|
+
this.headers = headers;
|
|
252
|
+
this.state = {
|
|
253
|
+
messages: [],
|
|
254
|
+
isExecuting: false
|
|
255
|
+
};
|
|
256
|
+
this.listeners = new Map();
|
|
257
|
+
if (options.threadId) this.state.threadId = options.threadId;
|
|
258
|
+
else this.state.threadId = v7();
|
|
259
|
+
}
|
|
244
260
|
}
|
|
245
261
|
export { WorkflowSession };
|
package/dist/sse.js
CHANGED
|
@@ -12,11 +12,13 @@ async function executeWorkflowSSE(url, body, callbacks, headers = {}) {
|
|
|
12
12
|
onmessage (msg) {
|
|
13
13
|
const eventType = msg.event;
|
|
14
14
|
if ('ok' === eventType) {
|
|
15
|
-
|
|
15
|
+
var _callbacks_onComplete;
|
|
16
|
+
null == (_callbacks_onComplete = callbacks.onComplete) || _callbacks_onComplete.call(callbacks);
|
|
16
17
|
ctrl.abort();
|
|
17
18
|
} else if ('err' === eventType) {
|
|
19
|
+
var _callbacks_onError;
|
|
18
20
|
const data = JSON.parse(msg.data);
|
|
19
|
-
callbacks.onError
|
|
21
|
+
null == (_callbacks_onError = callbacks.onError) || _callbacks_onError.call(callbacks, {
|
|
20
22
|
message: data.m
|
|
21
23
|
});
|
|
22
24
|
ctrl.abort();
|
|
@@ -24,19 +26,24 @@ async function executeWorkflowSSE(url, body, callbacks, headers = {}) {
|
|
|
24
26
|
const data = JSON.parse(msg.data);
|
|
25
27
|
switch(eventType){
|
|
26
28
|
case 'ws':
|
|
27
|
-
|
|
29
|
+
var _callbacks_onWorkflowStart;
|
|
30
|
+
null == (_callbacks_onWorkflowStart = callbacks.onWorkflowStart) || _callbacks_onWorkflowStart.call(callbacks, data);
|
|
28
31
|
break;
|
|
29
32
|
case 'ns':
|
|
30
|
-
|
|
33
|
+
var _callbacks_onNodeStart;
|
|
34
|
+
null == (_callbacks_onNodeStart = callbacks.onNodeStart) || _callbacks_onNodeStart.call(callbacks, data);
|
|
31
35
|
break;
|
|
32
36
|
case 'ne':
|
|
33
|
-
|
|
37
|
+
var _callbacks_onNodeEnd;
|
|
38
|
+
null == (_callbacks_onNodeEnd = callbacks.onNodeEnd) || _callbacks_onNodeEnd.call(callbacks, data);
|
|
34
39
|
break;
|
|
35
40
|
case 'tk':
|
|
36
|
-
|
|
41
|
+
var _callbacks_onToken;
|
|
42
|
+
null == (_callbacks_onToken = callbacks.onToken) || _callbacks_onToken.call(callbacks, data);
|
|
37
43
|
break;
|
|
38
44
|
case 'l':
|
|
39
|
-
|
|
45
|
+
var _callbacks_onLoading;
|
|
46
|
+
null == (_callbacks_onLoading = callbacks.onLoading) || _callbacks_onLoading.call(callbacks, data);
|
|
40
47
|
break;
|
|
41
48
|
}
|
|
42
49
|
} catch (e) {
|
|
@@ -44,14 +51,16 @@ async function executeWorkflowSSE(url, body, callbacks, headers = {}) {
|
|
|
44
51
|
}
|
|
45
52
|
},
|
|
46
53
|
onerror (err) {
|
|
47
|
-
|
|
54
|
+
var _callbacks_onError;
|
|
55
|
+
null == (_callbacks_onError = callbacks.onError) || _callbacks_onError.call(callbacks, {
|
|
48
56
|
message: String(err)
|
|
49
57
|
});
|
|
50
58
|
ctrl.abort();
|
|
51
59
|
throw err;
|
|
52
60
|
},
|
|
53
61
|
onclose () {
|
|
54
|
-
|
|
62
|
+
var _callbacks_onComplete;
|
|
63
|
+
null == (_callbacks_onComplete = callbacks.onComplete) || _callbacks_onComplete.call(callbacks);
|
|
55
64
|
ctrl.abort();
|
|
56
65
|
}
|
|
57
66
|
});
|
package/dist/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SDK 配置类型
|
|
3
3
|
*/
|
|
4
|
-
export interface
|
|
4
|
+
export interface ClientConfig {
|
|
5
5
|
/** API 服务器地址 */
|
|
6
6
|
baseUrl: string;
|
|
7
7
|
/** 请求超时时间(毫秒) */
|
|
@@ -29,6 +29,13 @@ export interface UploadParams {
|
|
|
29
29
|
/** 上传进度回调 */
|
|
30
30
|
onProgress?: (percent: number) => void;
|
|
31
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* 上传图片参数
|
|
34
|
+
*/
|
|
35
|
+
export interface UploadImageParams extends UploadParams {
|
|
36
|
+
/** 压缩选项 */
|
|
37
|
+
compressOptions?: CompressOptions;
|
|
38
|
+
}
|
|
32
39
|
/**
|
|
33
40
|
* 图片压缩选项
|
|
34
41
|
*/
|
package/dist/upload.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { UploadParams } from './types';
|
|
1
|
+
import type { UploadParams, UploadImageParams } from './types';
|
|
2
2
|
/**
|
|
3
3
|
* 文件上传服务
|
|
4
4
|
*/
|
|
@@ -21,5 +21,5 @@ export declare class UploadService {
|
|
|
21
21
|
/**
|
|
22
22
|
* 上传图片(自动压缩)
|
|
23
23
|
*/
|
|
24
|
-
uploadImage(
|
|
24
|
+
uploadImage(params: UploadImageParams): Promise<string>;
|
|
25
25
|
}
|
package/dist/upload.js
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
import cos_js_sdk_v5 from "cos-js-sdk-v5";
|
|
2
2
|
import compressorjs from "compressorjs";
|
|
3
|
+
function _define_property(obj, key, value) {
|
|
4
|
+
if (key in obj) Object.defineProperty(obj, key, {
|
|
5
|
+
value: value,
|
|
6
|
+
enumerable: true,
|
|
7
|
+
configurable: true,
|
|
8
|
+
writable: true
|
|
9
|
+
});
|
|
10
|
+
else obj[key] = value;
|
|
11
|
+
return obj;
|
|
12
|
+
}
|
|
3
13
|
class UploadService {
|
|
4
|
-
baseUrl;
|
|
5
|
-
headers;
|
|
6
|
-
constructor(baseUrl, headers = {}){
|
|
7
|
-
this.baseUrl = baseUrl;
|
|
8
|
-
this.headers = headers;
|
|
9
|
-
}
|
|
10
14
|
compressImage(file, options = {}) {
|
|
11
15
|
const { quality = 0.8, maxWidth = 1920, maxHeight = 1920, convertSize = 1000000 } = options;
|
|
12
16
|
return new Promise((resolve)=>{
|
|
@@ -91,13 +95,20 @@ class UploadService {
|
|
|
91
95
|
});
|
|
92
96
|
});
|
|
93
97
|
}
|
|
94
|
-
async uploadImage(
|
|
95
|
-
const
|
|
98
|
+
async uploadImage(params) {
|
|
99
|
+
const { file, resourceType, onProgress, compressOptions } = params;
|
|
100
|
+
const compressedFile = await this.compressImage(file, compressOptions);
|
|
96
101
|
return this.uploadFile({
|
|
97
102
|
file: compressedFile,
|
|
98
103
|
resourceType,
|
|
99
104
|
onProgress
|
|
100
105
|
});
|
|
101
106
|
}
|
|
107
|
+
constructor(baseUrl, headers = {}){
|
|
108
|
+
_define_property(this, "baseUrl", void 0);
|
|
109
|
+
_define_property(this, "headers", void 0);
|
|
110
|
+
this.baseUrl = baseUrl;
|
|
111
|
+
this.headers = headers;
|
|
112
|
+
}
|
|
102
113
|
}
|
|
103
114
|
export { UploadService };
|