@appconda/sdk 1.0.437 → 1.0.439

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.
@@ -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
@@ -1,2 +1,3 @@
1
1
  export * from './modules';
2
2
  export { getSDKForService } from './getSDKForService';
3
+ export * from './EmploidClient';
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './modules';
2
2
  export { getSDKForService } from './getSDKForService';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL21vZHVsZXMnO1xuZXhwb3J0IHsgZ2V0U0RLRm9yU2VydmljZSB9IGZyb20gJy4vZ2V0U0RLRm9yU2VydmljZSc7XG5cblxuIl19
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.437",
5
+ "version": "1.0.439",
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
@@ -1,4 +1,4 @@
1
1
  export * from './modules';
2
2
  export { getSDKForService } from './getSDKForService';
3
-
3
+ export * from './EmploidClient';
4
4