@appconda/sdk 1.0.437 → 1.0.438
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/EmploidClient.d.ts +52 -0
- package/dist/EmploidClient.js +78 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -1
- package/package.json +1 -1
- package/src/EmploidClient.ts +149 -0
- package/src/index.ts +1 -1
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
export interface PredictionData {
|
|
2
|
+
chatflowId: string;
|
|
3
|
+
question: string;
|
|
4
|
+
overrideConfig?: Record<string, any>;
|
|
5
|
+
chatId?: string;
|
|
6
|
+
streaming?: boolean;
|
|
7
|
+
history?: IMessage[];
|
|
8
|
+
uploads?: IFileUpload[];
|
|
9
|
+
leadEmail?: string;
|
|
10
|
+
action?: IAction;
|
|
11
|
+
}
|
|
12
|
+
interface IAction {
|
|
13
|
+
id?: string;
|
|
14
|
+
elements?: Array<{
|
|
15
|
+
type: string;
|
|
16
|
+
label: string;
|
|
17
|
+
}>;
|
|
18
|
+
mapping?: {
|
|
19
|
+
approve: string;
|
|
20
|
+
reject: string;
|
|
21
|
+
toolCalls: any[];
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
interface IFileUpload {
|
|
25
|
+
data?: string;
|
|
26
|
+
type: string;
|
|
27
|
+
name: string;
|
|
28
|
+
mime: string;
|
|
29
|
+
}
|
|
30
|
+
interface IMessage {
|
|
31
|
+
message: string;
|
|
32
|
+
type: MessageType;
|
|
33
|
+
role?: MessageType;
|
|
34
|
+
content?: string;
|
|
35
|
+
}
|
|
36
|
+
type MessageType = 'apiMessage' | 'userMessage';
|
|
37
|
+
export interface StreamResponse {
|
|
38
|
+
event: string;
|
|
39
|
+
data: string;
|
|
40
|
+
}
|
|
41
|
+
interface EmploidClientOptions {
|
|
42
|
+
baseUrl?: string;
|
|
43
|
+
apiKey?: string;
|
|
44
|
+
}
|
|
45
|
+
type PredictionResponse<T extends PredictionData> = T['streaming'] extends true ? AsyncGenerator<StreamResponse, void, unknown> : Record<string, any>;
|
|
46
|
+
export default class EmploidClient {
|
|
47
|
+
private baseUrl;
|
|
48
|
+
private apiKey;
|
|
49
|
+
constructor(options?: EmploidClientOptions);
|
|
50
|
+
createPrediction<T extends PredictionData>(data: T): Promise<PredictionResponse<T>>;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
export default class EmploidClient {
|
|
2
|
+
constructor(options = {}) {
|
|
3
|
+
this.baseUrl = options.baseUrl || 'http://localhost:3000';
|
|
4
|
+
this.apiKey = options.apiKey || '';
|
|
5
|
+
}
|
|
6
|
+
// Method to create a new prediction and handle streaming response
|
|
7
|
+
async createPrediction(data) {
|
|
8
|
+
const { chatflowId, streaming } = data;
|
|
9
|
+
// Check if chatflow is available to stream
|
|
10
|
+
const chatFlowStreamingUrl = `${this.baseUrl}/api/v1/chatflows-streaming/${chatflowId}`;
|
|
11
|
+
const resp = await fetch(chatFlowStreamingUrl, {
|
|
12
|
+
method: 'GET',
|
|
13
|
+
headers: {
|
|
14
|
+
'Content-Type': 'application/json',
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
const chatFlowStreamingData = await resp.json();
|
|
18
|
+
const isChatFlowAvailableToStream = chatFlowStreamingData.isStreaming || false;
|
|
19
|
+
const predictionUrl = `${this.baseUrl}/api/v1/prediction/${chatflowId}`;
|
|
20
|
+
const options = {
|
|
21
|
+
method: 'POST',
|
|
22
|
+
headers: {
|
|
23
|
+
'Content-Type': 'application/json',
|
|
24
|
+
},
|
|
25
|
+
body: JSON.stringify(data),
|
|
26
|
+
};
|
|
27
|
+
if (this.apiKey) {
|
|
28
|
+
options.headers['Authorization'] = `Bearer ${this.apiKey}`;
|
|
29
|
+
}
|
|
30
|
+
if (isChatFlowAvailableToStream && streaming) {
|
|
31
|
+
return {
|
|
32
|
+
async *[Symbol.asyncIterator]() {
|
|
33
|
+
const response = await fetch(predictionUrl, options);
|
|
34
|
+
if (!response.ok) {
|
|
35
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
36
|
+
}
|
|
37
|
+
//@ts-ignore
|
|
38
|
+
const reader = response.body.getReader();
|
|
39
|
+
const decoder = new TextDecoder();
|
|
40
|
+
let buffer = '';
|
|
41
|
+
try {
|
|
42
|
+
while (true) {
|
|
43
|
+
const { done, value } = await reader.read();
|
|
44
|
+
if (done)
|
|
45
|
+
break;
|
|
46
|
+
buffer += decoder.decode(value, { stream: true });
|
|
47
|
+
const lines = buffer.split('\n');
|
|
48
|
+
buffer = lines.pop() || '';
|
|
49
|
+
for (const line of lines) {
|
|
50
|
+
if (line.trim() === '')
|
|
51
|
+
continue;
|
|
52
|
+
if (line.startsWith('data:')) {
|
|
53
|
+
const stringifiedJson = line.replace('data:', '');
|
|
54
|
+
const event = JSON.parse(stringifiedJson);
|
|
55
|
+
yield event;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
reader.releaseLock();
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
try {
|
|
68
|
+
const response = await fetch(predictionUrl, options);
|
|
69
|
+
const resp = await response.json();
|
|
70
|
+
return resp;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
throw new Error('Error creating prediction');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRW1wbG9pZENsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9FbXBsb2lkQ2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQXVEQSxNQUFNLENBQUMsT0FBTyxPQUFPLGFBQWE7SUFJOUIsWUFBWSxVQUFnQyxFQUFFO1FBQzFDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSx1QkFBdUIsQ0FBQztRQUMxRCxJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksRUFBRSxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxrRUFBa0U7SUFDbEUsS0FBSyxDQUFDLGdCQUFnQixDQUNsQixJQUFPO1FBRVAsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFdkMsMkNBQTJDO1FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTywrQkFBK0IsVUFBVSxFQUFFLENBQUM7UUFDeEYsTUFBTSxJQUFJLEdBQUcsTUFBTSxLQUFLLENBQUMsb0JBQW9CLEVBQUU7WUFDM0MsTUFBTSxFQUFFLEtBQUs7WUFDYixPQUFPLEVBQUU7Z0JBQ0wsY0FBYyxFQUFFLGtCQUFrQjthQUNyQztTQUNKLENBQUMsQ0FBQztRQUVILE1BQU0scUJBQXFCLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEQsTUFBTSwyQkFBMkIsR0FDN0IscUJBQXFCLENBQUMsV0FBVyxJQUFJLEtBQUssQ0FBQztRQUUvQyxNQUFNLGFBQWEsR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLHNCQUFzQixVQUFVLEVBQUUsQ0FBQztRQUV4RSxNQUFNLE9BQU8sR0FBUTtZQUNqQixNQUFNLEVBQUUsTUFBTTtZQUNkLE9BQU8sRUFBRTtnQkFDTCxjQUFjLEVBQUUsa0JBQWtCO2FBQ3JDO1lBQ0QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQzdCLENBQUM7UUFDRixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNkLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsVUFBVSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDL0QsQ0FBQztRQUVELElBQUksMkJBQTJCLElBQUksU0FBUyxFQUFFLENBQUM7WUFDM0MsT0FBTztnQkFDSCxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7b0JBQ3pCLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFFckQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsQ0FBQzt3QkFDZixNQUFNLElBQUksS0FBSyxDQUNYLHVCQUF1QixRQUFRLENBQUMsTUFBTSxFQUFFLENBQzNDLENBQUM7b0JBQ04sQ0FBQztvQkFFRCxZQUFZO29CQUNaLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7b0JBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7b0JBQ2xDLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztvQkFFaEIsSUFBSSxDQUFDO3dCQUNELE9BQU8sSUFBSSxFQUFFLENBQUM7NEJBQ1YsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDNUMsSUFBSSxJQUFJO2dDQUFFLE1BQU07NEJBRWhCLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDOzRCQUNsRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDOzRCQUNqQyxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQzs0QkFFM0IsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztnQ0FDdkIsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtvQ0FBRSxTQUFTO2dDQUNqQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQ0FDM0IsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDaEMsT0FBTyxFQUNQLEVBQUUsQ0FDTCxDQUFDO29DQUNGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7b0NBQzFDLE1BQU0sS0FBSyxDQUFDO2dDQUNoQixDQUFDOzRCQUNMLENBQUM7d0JBQ0wsQ0FBQztvQkFDTCxDQUFDOzRCQUFTLENBQUM7d0JBQ1AsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO29CQUN6QixDQUFDO2dCQUNMLENBQUM7YUFDeUMsQ0FBQztRQUNuRCxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQztnQkFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ3JELE1BQU0sSUFBSSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNuQyxPQUFPLElBQXNDLENBQUM7WUFDbEQsQ0FBQztZQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ2pELENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGludGVyZmFjZSBQcmVkaWN0aW9uRGF0YSB7XG4gICAgY2hhdGZsb3dJZDogc3RyaW5nO1xuICAgIHF1ZXN0aW9uOiBzdHJpbmc7XG4gICAgb3ZlcnJpZGVDb25maWc/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgIGNoYXRJZD86IHN0cmluZztcbiAgICBzdHJlYW1pbmc/OiBib29sZWFuO1xuICAgIGhpc3Rvcnk/OiBJTWVzc2FnZVtdO1xuICAgIHVwbG9hZHM/OiBJRmlsZVVwbG9hZFtdO1xuICAgIGxlYWRFbWFpbD86IHN0cmluZ1xuICAgIGFjdGlvbj86IElBY3Rpb25cbn1cblxuaW50ZXJmYWNlIElBY3Rpb24ge1xuICAgIGlkPzogc3RyaW5nO1xuICAgIGVsZW1lbnRzPzogQXJyYXk8e1xuICAgICAgICB0eXBlOiBzdHJpbmc7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgfT47XG4gICAgbWFwcGluZz86IHtcbiAgICAgICAgYXBwcm92ZTogc3RyaW5nO1xuICAgICAgICByZWplY3Q6IHN0cmluZztcbiAgICAgICAgdG9vbENhbGxzOiBhbnlbXTtcbiAgICB9O1xufVxuXG5pbnRlcmZhY2UgSUZpbGVVcGxvYWQge1xuICAgIGRhdGE/OiBzdHJpbmc7XG4gICAgdHlwZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBtaW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBJTWVzc2FnZSB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIHR5cGU6IE1lc3NhZ2VUeXBlO1xuICAgIHJvbGU/OiBNZXNzYWdlVHlwZTtcbiAgICBjb250ZW50Pzogc3RyaW5nO1xufVxuXG50eXBlIE1lc3NhZ2VUeXBlID0gJ2FwaU1lc3NhZ2UnIHwgJ3VzZXJNZXNzYWdlJztcblxuZXhwb3J0IGludGVyZmFjZSBTdHJlYW1SZXNwb25zZSB7XG4gICAgZXZlbnQ6IHN0cmluZztcbiAgICBkYXRhOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBFbXBsb2lkQ2xpZW50T3B0aW9ucyB7XG4gICAgYmFzZVVybD86IHN0cmluZztcbiAgICBhcGlLZXk/OiBzdHJpbmc7XG59XG5cbnR5cGUgUHJlZGljdGlvblJlc3BvbnNlPFQgZXh0ZW5kcyBQcmVkaWN0aW9uRGF0YT4gPSBUWydzdHJlYW1pbmcnXSBleHRlbmRzIHRydWVcbiAgICA/IEFzeW5jR2VuZXJhdG9yPFN0cmVhbVJlc3BvbnNlLCB2b2lkLCB1bmtub3duPiAvLyBTdHJlYW1pbmcgcmV0dXJucyBhbiBhc3luYyBnZW5lcmF0b3JcbiAgICA6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVtcGxvaWRDbGllbnQge1xuICAgIHByaXZhdGUgYmFzZVVybDogc3RyaW5nO1xuICAgIHByaXZhdGUgYXBpS2V5OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOiBFbXBsb2lkQ2xpZW50T3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMuYmFzZVVybCA9IG9wdGlvbnMuYmFzZVVybCB8fCAnaHR0cDovL2xvY2FsaG9zdDozMDAwJztcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBvcHRpb25zLmFwaUtleSB8fCAnJztcbiAgICB9XG5cbiAgICAvLyBNZXRob2QgdG8gY3JlYXRlIGEgbmV3IHByZWRpY3Rpb24gYW5kIGhhbmRsZSBzdHJlYW1pbmcgcmVzcG9uc2VcbiAgICBhc3luYyBjcmVhdGVQcmVkaWN0aW9uPFQgZXh0ZW5kcyBQcmVkaWN0aW9uRGF0YT4oXG4gICAgICAgIGRhdGE6IFRcbiAgICApOiBQcm9taXNlPFByZWRpY3Rpb25SZXNwb25zZTxUPj4ge1xuICAgICAgICBjb25zdCB7IGNoYXRmbG93SWQsIHN0cmVhbWluZyB9ID0gZGF0YTtcblxuICAgICAgICAvLyBDaGVjayBpZiBjaGF0ZmxvdyBpcyBhdmFpbGFibGUgdG8gc3RyZWFtXG4gICAgICAgIGNvbnN0IGNoYXRGbG93U3RyZWFtaW5nVXJsID0gYCR7dGhpcy5iYXNlVXJsfS9hcGkvdjEvY2hhdGZsb3dzLXN0cmVhbWluZy8ke2NoYXRmbG93SWR9YDtcbiAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IGZldGNoKGNoYXRGbG93U3RyZWFtaW5nVXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjaGF0Rmxvd1N0cmVhbWluZ0RhdGEgPSBhd2FpdCByZXNwLmpzb24oKTtcbiAgICAgICAgY29uc3QgaXNDaGF0Rmxvd0F2YWlsYWJsZVRvU3RyZWFtID1cbiAgICAgICAgICAgIGNoYXRGbG93U3RyZWFtaW5nRGF0YS5pc1N0cmVhbWluZyB8fCBmYWxzZTtcblxuICAgICAgICBjb25zdCBwcmVkaWN0aW9uVXJsID0gYCR7dGhpcy5iYXNlVXJsfS9hcGkvdjEvcHJlZGljdGlvbi8ke2NoYXRmbG93SWR9YDtcblxuICAgICAgICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KGRhdGEpLFxuICAgICAgICB9O1xuICAgICAgICBpZiAodGhpcy5hcGlLZXkpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyc1snQXV0aG9yaXphdGlvbiddID0gYEJlYXJlciAke3RoaXMuYXBpS2V5fWA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNDaGF0Rmxvd0F2YWlsYWJsZVRvU3RyZWFtICYmIHN0cmVhbWluZykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhc3luYyAqW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChwcmVkaWN0aW9uVXJsLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEhUVFAgZXJyb3IhIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXN9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5LmdldFJlYWRlcigpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBidWZmZXIgPSAnJztcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb25lKSBicmVhaztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZXMgPSBidWZmZXIuc3BsaXQoJ1xcbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGxpbmVzLnBvcCgpIHx8ICcnO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsaW5lLnRyaW0oKSA9PT0gJycpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGluZS5zdGFydHNXaXRoKCdkYXRhOicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmdpZmllZEpzb24gPSBsaW5lLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGE6JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gSlNPTi5wYXJzZShzdHJpbmdpZmllZEpzb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgZXZlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIucmVsZWFzZUxvY2soKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9IGFzIHVua25vd24gYXMgUHJvbWlzZTxQcmVkaWN0aW9uUmVzcG9uc2U8VD4+O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHByZWRpY3Rpb25VcmwsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3AgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3AgYXMgUHJvbWlzZTxQcmVkaWN0aW9uUmVzcG9uc2U8VD4+O1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGNyZWF0aW5nIHByZWRpY3Rpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iXX0=
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export * from './modules';
|
|
2
2
|
export { getSDKForService } from './getSDKForService';
|
|
3
|
-
|
|
3
|
+
export * from './EmploidClient';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsY0FBYyxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbW9kdWxlcyc7XG5leHBvcnQgeyBnZXRTREtGb3JTZXJ2aWNlIH0gZnJvbSAnLi9nZXRTREtGb3JTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vRW1wbG9pZENsaWVudCc7XG5cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@appconda/sdk",
|
|
3
3
|
"homepage": "https://appconda.io/support",
|
|
4
4
|
"description": "Appconda is an open-source self-hosted backend server that abstract and simplify complex and repetitive development tasks behind a very simple REST API",
|
|
5
|
-
"version": "1.0.
|
|
5
|
+
"version": "1.0.438",
|
|
6
6
|
"license": "BSD-3-Clause",
|
|
7
7
|
"main": "dist/index.js",
|
|
8
8
|
"types": "dist/index.d.ts",
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
export interface PredictionData {
|
|
2
|
+
chatflowId: string;
|
|
3
|
+
question: string;
|
|
4
|
+
overrideConfig?: Record<string, any>;
|
|
5
|
+
chatId?: string;
|
|
6
|
+
streaming?: boolean;
|
|
7
|
+
history?: IMessage[];
|
|
8
|
+
uploads?: IFileUpload[];
|
|
9
|
+
leadEmail?: string
|
|
10
|
+
action?: IAction
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
interface IAction {
|
|
14
|
+
id?: string;
|
|
15
|
+
elements?: Array<{
|
|
16
|
+
type: string;
|
|
17
|
+
label: string;
|
|
18
|
+
}>;
|
|
19
|
+
mapping?: {
|
|
20
|
+
approve: string;
|
|
21
|
+
reject: string;
|
|
22
|
+
toolCalls: any[];
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface IFileUpload {
|
|
27
|
+
data?: string;
|
|
28
|
+
type: string;
|
|
29
|
+
name: string;
|
|
30
|
+
mime: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface IMessage {
|
|
34
|
+
message: string;
|
|
35
|
+
type: MessageType;
|
|
36
|
+
role?: MessageType;
|
|
37
|
+
content?: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
type MessageType = 'apiMessage' | 'userMessage';
|
|
41
|
+
|
|
42
|
+
export interface StreamResponse {
|
|
43
|
+
event: string;
|
|
44
|
+
data: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface EmploidClientOptions {
|
|
48
|
+
baseUrl?: string;
|
|
49
|
+
apiKey?: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
type PredictionResponse<T extends PredictionData> = T['streaming'] extends true
|
|
53
|
+
? AsyncGenerator<StreamResponse, void, unknown> // Streaming returns an async generator
|
|
54
|
+
: Record<string, any>;
|
|
55
|
+
|
|
56
|
+
export default class EmploidClient {
|
|
57
|
+
private baseUrl: string;
|
|
58
|
+
private apiKey: string;
|
|
59
|
+
|
|
60
|
+
constructor(options: EmploidClientOptions = {}) {
|
|
61
|
+
this.baseUrl = options.baseUrl || 'http://localhost:3000';
|
|
62
|
+
this.apiKey = options.apiKey || '';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// Method to create a new prediction and handle streaming response
|
|
66
|
+
async createPrediction<T extends PredictionData>(
|
|
67
|
+
data: T
|
|
68
|
+
): Promise<PredictionResponse<T>> {
|
|
69
|
+
const { chatflowId, streaming } = data;
|
|
70
|
+
|
|
71
|
+
// Check if chatflow is available to stream
|
|
72
|
+
const chatFlowStreamingUrl = `${this.baseUrl}/api/v1/chatflows-streaming/${chatflowId}`;
|
|
73
|
+
const resp = await fetch(chatFlowStreamingUrl, {
|
|
74
|
+
method: 'GET',
|
|
75
|
+
headers: {
|
|
76
|
+
'Content-Type': 'application/json',
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const chatFlowStreamingData = await resp.json();
|
|
81
|
+
const isChatFlowAvailableToStream =
|
|
82
|
+
chatFlowStreamingData.isStreaming || false;
|
|
83
|
+
|
|
84
|
+
const predictionUrl = `${this.baseUrl}/api/v1/prediction/${chatflowId}`;
|
|
85
|
+
|
|
86
|
+
const options: any = {
|
|
87
|
+
method: 'POST',
|
|
88
|
+
headers: {
|
|
89
|
+
'Content-Type': 'application/json',
|
|
90
|
+
},
|
|
91
|
+
body: JSON.stringify(data),
|
|
92
|
+
};
|
|
93
|
+
if (this.apiKey) {
|
|
94
|
+
options.headers['Authorization'] = `Bearer ${this.apiKey}`;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
if (isChatFlowAvailableToStream && streaming) {
|
|
98
|
+
return {
|
|
99
|
+
async *[Symbol.asyncIterator]() {
|
|
100
|
+
const response = await fetch(predictionUrl, options);
|
|
101
|
+
|
|
102
|
+
if (!response.ok) {
|
|
103
|
+
throw new Error(
|
|
104
|
+
`HTTP error! status: ${response.status}`
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
//@ts-ignore
|
|
109
|
+
const reader = response.body.getReader();
|
|
110
|
+
const decoder = new TextDecoder();
|
|
111
|
+
let buffer = '';
|
|
112
|
+
|
|
113
|
+
try {
|
|
114
|
+
while (true) {
|
|
115
|
+
const { done, value } = await reader.read();
|
|
116
|
+
if (done) break;
|
|
117
|
+
|
|
118
|
+
buffer += decoder.decode(value, { stream: true });
|
|
119
|
+
const lines = buffer.split('\n');
|
|
120
|
+
buffer = lines.pop() || '';
|
|
121
|
+
|
|
122
|
+
for (const line of lines) {
|
|
123
|
+
if (line.trim() === '') continue;
|
|
124
|
+
if (line.startsWith('data:')) {
|
|
125
|
+
const stringifiedJson = line.replace(
|
|
126
|
+
'data:',
|
|
127
|
+
''
|
|
128
|
+
);
|
|
129
|
+
const event = JSON.parse(stringifiedJson);
|
|
130
|
+
yield event;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} finally {
|
|
135
|
+
reader.releaseLock();
|
|
136
|
+
}
|
|
137
|
+
},
|
|
138
|
+
} as unknown as Promise<PredictionResponse<T>>;
|
|
139
|
+
} else {
|
|
140
|
+
try {
|
|
141
|
+
const response = await fetch(predictionUrl, options);
|
|
142
|
+
const resp = await response.json();
|
|
143
|
+
return resp as Promise<PredictionResponse<T>>;
|
|
144
|
+
} catch (error) {
|
|
145
|
+
throw new Error('Error creating prediction');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
package/src/index.ts
CHANGED