@gradio/client 0.18.0 → 0.19.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/CHANGELOG.md +17 -0
- package/README.md +10 -6
- package/dist/client.d.ts +4 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/helpers/api_info.d.ts +22 -0
- package/dist/helpers/api_info.d.ts.map +1 -1
- package/dist/index.js +105 -26
- package/dist/types.d.ts +19 -4
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/predict.d.ts +1 -1
- package/dist/utils/predict.d.ts.map +1 -1
- package/dist/utils/stream.d.ts +1 -1
- package/dist/utils/stream.d.ts.map +1 -1
- package/dist/utils/submit.d.ts +1 -1
- package/dist/utils/submit.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +24 -19
- package/src/helpers/api_info.ts +110 -7
- package/src/test/api_info.test.ts +112 -1
- package/src/test/mock_eventsource.ts +11 -9
- package/src/test/stream.test.ts +23 -11
- package/src/types.ts +32 -14
- package/src/utils/predict.ts +2 -2
- package/src/utils/stream.ts +2 -2
- package/src/utils/submit.ts +21 -6
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
1
|
# @gradio/client
|
2
2
|
|
3
|
+
## 0.19.1
|
4
|
+
|
5
|
+
### Fixes
|
6
|
+
|
7
|
+
- [#8272](https://github.com/gradio-app/gradio/pull/8272) [`fbf4edd`](https://github.com/gradio-app/gradio/commit/fbf4edde7c896cdf4c903463e44c31ed96111b3c) - ensure client works for private spaces. Thanks @pngwn!
|
8
|
+
|
9
|
+
## 0.19.0
|
10
|
+
|
11
|
+
### Features
|
12
|
+
|
13
|
+
- [#8110](https://github.com/gradio-app/gradio/pull/8110) [`5436031`](https://github.com/gradio-app/gradio/commit/5436031f92c1596282eb64e1e74d555f279e9697) - Render decorator 2. Thanks @aliabid94!
|
14
|
+
- [#8197](https://github.com/gradio-app/gradio/pull/8197) [`e09b4e8`](https://github.com/gradio-app/gradio/commit/e09b4e8216b970bc1b142a0f08e7d190b954eb35) - Add support for passing keyword args to `data` in JS client. Thanks @hannahblair!
|
15
|
+
|
16
|
+
### Fixes
|
17
|
+
|
18
|
+
- [#8252](https://github.com/gradio-app/gradio/pull/8252) [`22df61a`](https://github.com/gradio-app/gradio/commit/22df61a26adf8023f6dd49c051979990e8d3879a) - Client node fix. Thanks @pngwn!
|
19
|
+
|
3
20
|
## 0.18.0
|
4
21
|
|
5
22
|
### Features
|
package/README.md
CHANGED
@@ -127,7 +127,11 @@ The `payload` argument is generally required but this depends on the API itself.
|
|
127
127
|
import { Client } from "@gradio/client";
|
128
128
|
|
129
129
|
const app = await Client.connect("user/space-name");
|
130
|
-
const result = await app.predict("/predict",
|
130
|
+
const result = await app.predict("/predict", {
|
131
|
+
input: 1,
|
132
|
+
word_1: "Hello",
|
133
|
+
word_2: "friends"
|
134
|
+
});
|
131
135
|
```
|
132
136
|
|
133
137
|
#### `submit`
|
@@ -138,7 +142,7 @@ The `submit` method provides a more flexible way to call an API endpoint, provid
|
|
138
142
|
import { Client } from "@gradio/client";
|
139
143
|
|
140
144
|
const app = await Client.connect("user/space-name");
|
141
|
-
const submission = app.submit("/predict",
|
145
|
+
const submission = app.submit("/predict", { name: "Chewbacca" });
|
142
146
|
```
|
143
147
|
|
144
148
|
The `submit` method accepts the same [`endpoint`](#endpoint) and [`payload`](#payload) arguments as `predict`.
|
@@ -183,7 +187,7 @@ import { Client } from "@gradio/client";
|
|
183
187
|
|
184
188
|
const app = await Client.connect("user/space-name");
|
185
189
|
const submission = app
|
186
|
-
.submit("/predict",
|
190
|
+
.submit("/predict", { name: "Chewbacca" })
|
187
191
|
.on("data", (data) => console.log(data))
|
188
192
|
.on("status", (status: Status) => console.log(status));
|
189
193
|
```
|
@@ -198,7 +202,7 @@ import { Client } from "@gradio/client";
|
|
198
202
|
const app = await Client.connect("user/space-name");
|
199
203
|
const handle_data = (data) => console.log(data);
|
200
204
|
|
201
|
-
const submission = app.submit("/predict",
|
205
|
+
const submission = app.submit("/predict", { name: "Chewbacca" }).on("data", handle_data);
|
202
206
|
|
203
207
|
// later
|
204
208
|
submission.off("/predict", handle_data);
|
@@ -214,7 +218,7 @@ import { Client } from "@gradio/client";
|
|
214
218
|
const app = await Client.connect("user/space-name");
|
215
219
|
const handle_data = (data) => console.log(data);
|
216
220
|
|
217
|
-
const submission = app.submit("/predict",
|
221
|
+
const submission = app.submit("/predict", { name: "Chewbacca" }).on("data", handle_data);
|
218
222
|
|
219
223
|
// later
|
220
224
|
submission.destroy();
|
@@ -229,7 +233,7 @@ import { Client } from "@gradio/client";
|
|
229
233
|
|
230
234
|
const app = await Client.connect("user/space-name");
|
231
235
|
const submission = app
|
232
|
-
.submit("/predict",
|
236
|
+
.submit("/predict", { name: "Chewbacca" })
|
233
237
|
.on("data", (data) => console.log(data));
|
234
238
|
|
235
239
|
// later
|
package/dist/client.d.ts
CHANGED
@@ -21,15 +21,15 @@ export declare class Client {
|
|
21
21
|
unclosed_events: Set<string>;
|
22
22
|
heartbeat_event: EventSource | null;
|
23
23
|
fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response>;
|
24
|
-
|
24
|
+
stream(url: URL): Promise<EventSource>;
|
25
25
|
view_api: () => Promise<ApiInfo<JsApiData>>;
|
26
26
|
upload_files: (root_url: string, files: (Blob | File)[], upload_id?: string) => Promise<UploadResponse>;
|
27
27
|
upload: (file_data: FileData[], root_url: string, upload_id?: string, max_file_size?: number) => Promise<(FileData | null)[] | null>;
|
28
28
|
handle_blob: (endpoint: string, data: unknown[], endpoint_info: EndpointInfo<ApiData | JsApiData>) => Promise<unknown[]>;
|
29
29
|
post_data: (url: string, body: unknown, additional_headers?: any) => Promise<unknown[]>;
|
30
|
-
submit: (endpoint: string | number, data: unknown[], event_data?: unknown, trigger_id?: number | null) => SubmitReturn;
|
31
|
-
predict: (endpoint: string | number, data
|
32
|
-
open_stream: () => void
|
30
|
+
submit: (endpoint: string | number, data: unknown[] | Record<string, unknown>, event_data?: unknown, trigger_id?: number | null) => SubmitReturn;
|
31
|
+
predict: (endpoint: string | number, data: unknown[] | Record<string, unknown>, event_data?: unknown) => Promise<SubmitReturn>;
|
32
|
+
open_stream: () => Promise<void>;
|
33
33
|
private resolve_config;
|
34
34
|
constructor(app_reference: string, options?: ClientOptions);
|
35
35
|
private init;
|
package/dist/client.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,OAAO,EACP,OAAO,EACP,aAAa,EACb,MAAM,EACN,gBAAgB,EAChB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,MAAM,EACN,YAAY,EACZ,cAAc,EAEd,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAU,QAAQ,EAAE,MAAM,UAAU,CAAC;AAgB5C,qBAAa,QAAS,SAAQ,IAAI;gBACrB,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe;CAG7D;AAED,qBAAa,MAAM;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,aAAa,CAAC;IAEvB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IACrC,YAAY,EAAE,MAAM,CAA2C;IAC/D,GAAG,EAAE,MAAM,GAAG,KAAK,CAAS;IAC5B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC,CAAM;IAGlD,aAAa;;MAAmB;IAChC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAM;IACtD,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,CAAM;IACnD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM;IACxE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAa;IACzC,eAAe,EAAE,WAAW,GAAG,IAAI,CAAQ;IAE3C,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,GAAG,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
@@ -22,4 +22,26 @@ export declare function handle_message(data: any, last_status: Status["stage"]):
|
|
22
22
|
data?: any;
|
23
23
|
status?: Status;
|
24
24
|
};
|
25
|
+
/**
|
26
|
+
* Maps the provided `data` to the parameters defined by the `/info` endpoint response.
|
27
|
+
* This allows us to support both positional and keyword arguments passed to the client
|
28
|
+
* and ensures that all parameters are either directly provided or have default values assigned.
|
29
|
+
*
|
30
|
+
* @param {unknown[] | Record<string, unknown>} data - The input data for the function,
|
31
|
+
* which can be either an array of values for positional arguments or an object
|
32
|
+
* with key-value pairs for keyword arguments.
|
33
|
+
* @param {JsApiData[]} parameters - Array of parameter descriptions retrieved from the
|
34
|
+
* `/info` endpoint.
|
35
|
+
*
|
36
|
+
* @returns {unknown[]} - Returns an array of resolved data where each element corresponds
|
37
|
+
* to the expected parameter from the API. The `parameter_default` value is used where
|
38
|
+
* a value is not provided for a parameter, and optional parameters without defaults are
|
39
|
+
* set to `undefined`.
|
40
|
+
*
|
41
|
+
* @throws {Error} - Throws an error:
|
42
|
+
* - If more arguments are provided than are defined in the parameters.
|
43
|
+
* * - If no parameter value is provided for a required parameter and no default value is defined.
|
44
|
+
* - If an argument is provided that does not match any defined parameter.
|
45
|
+
*/
|
46
|
+
export declare const map_data_to_params: (data: unknown[] | Record<string, unknown>, api_info: ApiInfo<JsApiData | ApiData>) => unknown[];
|
25
47
|
//# sourceMappingURL=api_info.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"api_info.d.ts","sourceRoot":"","sources":["../../src/helpers/api_info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGpE,eAAO,MAAM,aAAa,QAAqB,CAAC;AAChD,eAAO,MAAM,eAAe,QAAwB,CAAC;AAErD,wBAAsB,gBAAgB,CACrC,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,MAAM,EAAE,GACvB,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,IAAI,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE,OAAO,GAAG,QAAQ,CAAC;CAClC,CAAC,CA4CD;AAED,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,SAAS,CAAC,
|
1
|
+
{"version":3,"file":"api_info.d.ts","sourceRoot":"","sources":["../../src/helpers/api_info.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGpE,eAAO,MAAM,aAAa,QAAqB,CAAC;AAChD,eAAO,MAAM,eAAe,QAAwB,CAAC;AAErD,wBAAsB,gBAAgB,CACrC,aAAa,EAAE,MAAM,EACrB,QAAQ,CAAC,EAAE,MAAM,MAAM,EAAE,GACvB,OAAO,CAAC;IACV,QAAQ,EAAE,MAAM,GAAG,KAAK,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,IAAI,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE,OAAO,GAAG,QAAQ,CAAC;CAClC,CAAC,CA4CD;AAED,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,EAC1B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,SAAS,CAAC,CAiFpB;AAED,wBAAgB,QAAQ,CACvB,IAAI,EAAE;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACxC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,QAAQ,GAAG,WAAW,GACpC,MAAM,GAAG,SAAS,CAiCpB;AAED,wBAAgB,eAAe,CAC9B,IAAI,EAAE;IAAE,IAAI,EAAE,GAAG,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EACxC,UAAU,EAAE,MAAM,GAChB,MAAM,CASR;AAED,wBAAgB,cAAc,CAC7B,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,GAC1B;IACF,IAAI,EACD,MAAM,GACN,MAAM,GACN,QAAQ,GACR,UAAU,GACV,YAAY,GACZ,KAAK,GACL,MAAM,GACN,WAAW,GACX,kBAAkB,CAAC;IACtB,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB,CAgHA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,eAAO,MAAM,kBAAkB,SACxB,OAAO,EAAE,GAAG,OAAO,MAAM,EAAE,OAAO,CAAC,YAC/B,QAAQ,SAAS,GAAG,OAAO,CAAC,KACpC,OAAO,EA4CT,CAAC"}
|
package/dist/index.js
CHANGED
@@ -5,7 +5,7 @@ var __publicField = (obj, key, value) => {
|
|
5
5
|
return value;
|
6
6
|
};
|
7
7
|
var fn = new Intl.Collator(0, { numeric: 1 }).compare;
|
8
|
-
function semiver
|
8
|
+
function semiver(a, b, bool) {
|
9
9
|
a = a.split(".");
|
10
10
|
b = b.split(".");
|
11
11
|
return fn(a[0], b[0]) || fn(a[1], b[1]) || (b[2] = b.slice(2).join("."), bool = /[.-]/.test(a[2] = a.slice(2).join(".")), bool == /[.-]/.test(b[2]) ? fn(a[2], b[2]) : bool ? -1 : 1);
|
@@ -150,19 +150,46 @@ function transform_api_info(api_info, config, api_map) {
|
|
150
150
|
transformed_info[category] = {};
|
151
151
|
Object.entries(api_info[category]).forEach(
|
152
152
|
([endpoint, { parameters, returns }]) => {
|
153
|
-
|
153
|
+
var _a, _b;
|
154
|
+
const dependencyIndex = config.dependencies.findIndex(
|
155
|
+
(dep) => dep.api_name === endpoint || dep.api_name === endpoint.replace("/", "")
|
156
|
+
) || api_map[endpoint.replace("/", "")] || -1;
|
154
157
|
const dependencyTypes = dependencyIndex !== -1 ? config.dependencies[dependencyIndex].types : { continuous: false, generator: false };
|
158
|
+
if (dependencyIndex !== -1 && ((_b = (_a = config.dependencies[dependencyIndex]) == null ? void 0 : _a.inputs) == null ? void 0 : _b.length) !== parameters.length) {
|
159
|
+
const components = config.dependencies[dependencyIndex].inputs.map(
|
160
|
+
(input) => {
|
161
|
+
var _a2;
|
162
|
+
return (_a2 = config.components.find((c) => c.id === input)) == null ? void 0 : _a2.type;
|
163
|
+
}
|
164
|
+
);
|
165
|
+
try {
|
166
|
+
components.forEach((comp, idx) => {
|
167
|
+
if (comp === "state") {
|
168
|
+
const new_param = {
|
169
|
+
component: "state",
|
170
|
+
example: null,
|
171
|
+
parameter_default: null,
|
172
|
+
parameter_has_default: true,
|
173
|
+
parameter_name: null,
|
174
|
+
hidden: true
|
175
|
+
};
|
176
|
+
parameters.splice(idx, 0, new_param);
|
177
|
+
}
|
178
|
+
});
|
179
|
+
} catch (e) {
|
180
|
+
}
|
181
|
+
}
|
155
182
|
const transform_type = (data, component, serializer, signature_type) => ({
|
156
183
|
...data,
|
157
|
-
description: get_description(data.type, serializer),
|
158
|
-
type: get_type(data.type, component, serializer, signature_type) || ""
|
184
|
+
description: get_description(data == null ? void 0 : data.type, serializer),
|
185
|
+
type: get_type(data == null ? void 0 : data.type, component, serializer, signature_type) || ""
|
159
186
|
});
|
160
187
|
transformed_info[category][endpoint] = {
|
161
188
|
parameters: parameters.map(
|
162
|
-
(p) => transform_type(p, p.component, p.serializer, "parameter")
|
189
|
+
(p) => transform_type(p, p == null ? void 0 : p.component, p == null ? void 0 : p.serializer, "parameter")
|
163
190
|
),
|
164
191
|
returns: returns.map(
|
165
|
-
(r) => transform_type(r, r.component, r.serializer, "return")
|
192
|
+
(r) => transform_type(r, r == null ? void 0 : r.component, r == null ? void 0 : r.serializer, "return")
|
166
193
|
),
|
167
194
|
type: dependencyTypes
|
168
195
|
};
|
@@ -173,7 +200,7 @@ function transform_api_info(api_info, config, api_map) {
|
|
173
200
|
return transformed_info;
|
174
201
|
}
|
175
202
|
function get_type(type, component, serializer, signature_type) {
|
176
|
-
switch (type.type) {
|
203
|
+
switch (type == null ? void 0 : type.type) {
|
177
204
|
case "string":
|
178
205
|
return "string";
|
179
206
|
case "boolean":
|
@@ -204,7 +231,7 @@ function get_description(type, serializer) {
|
|
204
231
|
} else if (serializer === "FileSerializable") {
|
205
232
|
return "array of files or single file";
|
206
233
|
}
|
207
|
-
return type.description;
|
234
|
+
return type == null ? void 0 : type.description;
|
208
235
|
}
|
209
236
|
function handle_message(data, last_status) {
|
210
237
|
const queue = true;
|
@@ -317,6 +344,45 @@ function handle_message(data, last_status) {
|
|
317
344
|
}
|
318
345
|
return { type: "none", status: { stage: "error", queue } };
|
319
346
|
}
|
347
|
+
const map_data_to_params = (data, api_info) => {
|
348
|
+
const parameters = Object.values(api_info.named_endpoints).flatMap(
|
349
|
+
(values) => values.parameters
|
350
|
+
);
|
351
|
+
if (Array.isArray(data)) {
|
352
|
+
if (data.length > parameters.length) {
|
353
|
+
console.warn("Too many arguments provided for the endpoint.");
|
354
|
+
}
|
355
|
+
return data;
|
356
|
+
}
|
357
|
+
const resolved_data = [];
|
358
|
+
const provided_keys = Object.keys(data);
|
359
|
+
parameters.forEach((param, index) => {
|
360
|
+
if (data.hasOwnProperty(param.parameter_name)) {
|
361
|
+
resolved_data[index] = data[param.parameter_name];
|
362
|
+
} else if (param.parameter_has_default) {
|
363
|
+
resolved_data[index] = param.parameter_default;
|
364
|
+
} else {
|
365
|
+
throw new Error(
|
366
|
+
`No value provided for required parameter: ${param.parameter_name}`
|
367
|
+
);
|
368
|
+
}
|
369
|
+
});
|
370
|
+
provided_keys.forEach((key) => {
|
371
|
+
if (!parameters.some((param) => param.parameter_name === key)) {
|
372
|
+
throw new Error(
|
373
|
+
`Parameter \`${key}\` is not a valid keyword argument. Please refer to the API for usage.`
|
374
|
+
);
|
375
|
+
}
|
376
|
+
});
|
377
|
+
resolved_data.forEach((value, idx) => {
|
378
|
+
if (value === void 0 && !parameters[idx].parameter_has_default) {
|
379
|
+
throw new Error(
|
380
|
+
`No value provided for required parameter: ${parameters[idx].parameter_name}`
|
381
|
+
);
|
382
|
+
}
|
383
|
+
});
|
384
|
+
return resolved_data;
|
385
|
+
};
|
320
386
|
async function view_api() {
|
321
387
|
if (this.api_info)
|
322
388
|
return this.api_info;
|
@@ -331,7 +397,7 @@ async function view_api() {
|
|
331
397
|
}
|
332
398
|
try {
|
333
399
|
let response;
|
334
|
-
if (semiver
|
400
|
+
if (semiver((config == null ? void 0 : config.version) || "2.0.0", "3.30") < 0) {
|
335
401
|
response = await this.fetch(SPACE_FETCHER_URL, {
|
336
402
|
method: "POST",
|
337
403
|
body: JSON.stringify({
|
@@ -638,7 +704,7 @@ async function predict(endpoint, data) {
|
|
638
704
|
);
|
639
705
|
}
|
640
706
|
return new Promise(async (resolve, reject) => {
|
641
|
-
const app = this.submit(endpoint, data
|
707
|
+
const app = this.submit(endpoint, data);
|
642
708
|
let result;
|
643
709
|
app.on("data", (d) => {
|
644
710
|
if (status_complete) {
|
@@ -885,7 +951,7 @@ function get_space_reference(url) {
|
|
885
951
|
return match[1];
|
886
952
|
}
|
887
953
|
}
|
888
|
-
function open_stream() {
|
954
|
+
async function open_stream() {
|
889
955
|
let {
|
890
956
|
event_callbacks,
|
891
957
|
unclosed_events,
|
@@ -906,7 +972,7 @@ function open_stream() {
|
|
906
972
|
if (jwt) {
|
907
973
|
url.searchParams.set("__sign", jwt);
|
908
974
|
}
|
909
|
-
stream = this.
|
975
|
+
stream = await this.stream(url);
|
910
976
|
if (!stream) {
|
911
977
|
console.warn("Cannot connect to SSE endpoint: " + url.toString());
|
912
978
|
return;
|
@@ -1074,6 +1140,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1074
1140
|
api_map,
|
1075
1141
|
config
|
1076
1142
|
);
|
1143
|
+
let resolved_data = map_data_to_params(data, api_info);
|
1077
1144
|
let websocket;
|
1078
1145
|
let stream;
|
1079
1146
|
let protocol = config.protocol ?? "ws";
|
@@ -1126,7 +1193,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1126
1193
|
);
|
1127
1194
|
}
|
1128
1195
|
}
|
1129
|
-
this.handle_blob(config.root,
|
1196
|
+
this.handle_blob(config.root, resolved_data, endpoint_info).then(
|
1130
1197
|
async (_payload) => {
|
1131
1198
|
var _a;
|
1132
1199
|
payload = {
|
@@ -1323,7 +1390,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1323
1390
|
if (this.jwt) {
|
1324
1391
|
url.searchParams.set("__sign", this.jwt);
|
1325
1392
|
}
|
1326
|
-
stream = this.
|
1393
|
+
stream = await this.stream(url);
|
1327
1394
|
if (!stream) {
|
1328
1395
|
return Promise.reject(
|
1329
1396
|
new Error("Cannot connect to SSE endpoint: " + url.toString())
|
@@ -1436,7 +1503,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1436
1503
|
headers
|
1437
1504
|
);
|
1438
1505
|
});
|
1439
|
-
post_data_promise.then(([response, status]) => {
|
1506
|
+
post_data_promise.then(async ([response, status]) => {
|
1440
1507
|
if (status === 503) {
|
1441
1508
|
fire_event({
|
1442
1509
|
type: "status",
|
@@ -1520,6 +1587,14 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1520
1587
|
endpoint: _endpoint,
|
1521
1588
|
fn_index
|
1522
1589
|
});
|
1590
|
+
if (data2.render_config) {
|
1591
|
+
fire_event({
|
1592
|
+
type: "render",
|
1593
|
+
data: data2.render_config,
|
1594
|
+
endpoint: _endpoint,
|
1595
|
+
fn_index
|
1596
|
+
});
|
1597
|
+
}
|
1523
1598
|
if (complete) {
|
1524
1599
|
fire_event({
|
1525
1600
|
type: "status",
|
@@ -1566,7 +1641,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1566
1641
|
event_callbacks[event_id] = callback;
|
1567
1642
|
unclosed_events.add(event_id);
|
1568
1643
|
if (!stream_status.open) {
|
1569
|
-
this.open_stream();
|
1644
|
+
await this.open_stream();
|
1570
1645
|
}
|
1571
1646
|
}
|
1572
1647
|
});
|
@@ -1646,17 +1721,18 @@ class Client {
|
|
1646
1721
|
fetch(input, init) {
|
1647
1722
|
return fetch(input, init);
|
1648
1723
|
}
|
1649
|
-
|
1724
|
+
async stream(url) {
|
1650
1725
|
if (typeof window === "undefined" || typeof EventSource === "undefined") {
|
1651
|
-
|
1726
|
+
try {
|
1727
|
+
const EventSourceModule = await import("eventsource");
|
1652
1728
|
return new EventSourceModule.default(url.toString());
|
1653
|
-
}
|
1654
|
-
|
1655
|
-
|
1729
|
+
} catch (error) {
|
1730
|
+
console.error("Failed to load EventSource module:", error);
|
1731
|
+
throw error;
|
1732
|
+
}
|
1656
1733
|
} else {
|
1657
1734
|
return new EventSource(url.toString());
|
1658
1735
|
}
|
1659
|
-
return null;
|
1660
1736
|
}
|
1661
1737
|
async init() {
|
1662
1738
|
var _a;
|
@@ -1670,16 +1746,19 @@ class Client {
|
|
1670
1746
|
if (config) {
|
1671
1747
|
this.config = config;
|
1672
1748
|
if (this.config && this.config.connect_heartbeat) {
|
1673
|
-
const heartbeat_url = new URL(
|
1674
|
-
`${this.config.root}/heartbeat/${this.session_hash}`
|
1675
|
-
);
|
1676
|
-
this.heartbeat_event = this.stream_factory(heartbeat_url);
|
1677
1749
|
if (this.config.space_id && this.options.hf_token) {
|
1678
1750
|
this.jwt = await get_jwt(
|
1679
1751
|
this.config.space_id,
|
1680
1752
|
this.options.hf_token
|
1681
1753
|
);
|
1682
1754
|
}
|
1755
|
+
const heartbeat_url = new URL(
|
1756
|
+
`${this.config.root}/heartbeat/${this.session_hash}`
|
1757
|
+
);
|
1758
|
+
if (this.jwt) {
|
1759
|
+
heartbeat_url.searchParams.set("jwt", this.jwt);
|
1760
|
+
}
|
1761
|
+
this.heartbeat_event = await this.stream(heartbeat_url);
|
1683
1762
|
}
|
1684
1763
|
}
|
1685
1764
|
});
|
package/dist/types.d.ts
CHANGED
@@ -2,6 +2,9 @@
|
|
2
2
|
import { hardware_types } from "./helpers/spaces";
|
3
3
|
export interface ApiData {
|
4
4
|
label: string;
|
5
|
+
parameter_name: string;
|
6
|
+
parameter_default?: any;
|
7
|
+
parameter_has_default?: boolean;
|
5
8
|
type: {
|
6
9
|
type: any;
|
7
10
|
description: string;
|
@@ -16,6 +19,9 @@ export interface ApiData {
|
|
16
19
|
}
|
17
20
|
export interface JsApiData {
|
18
21
|
label: string;
|
22
|
+
parameter_name: string;
|
23
|
+
parameter_default?: any;
|
24
|
+
parameter_has_default?: boolean;
|
19
25
|
type: string;
|
20
26
|
description: string;
|
21
27
|
component: string;
|
@@ -41,12 +47,13 @@ export interface BlobRef {
|
|
41
47
|
blob: Blob | File | false;
|
42
48
|
}
|
43
49
|
export type DataType = string | Buffer | Record<string, any> | any[];
|
50
|
+
export type SubmitFunction = (endpoint: string | number, data: unknown[] | Record<string, unknown>, event_data?: unknown, trigger_id?: number | null) => SubmitReturn;
|
51
|
+
export type PredictFunction = (endpoint: string | number, data: unknown[] | Record<string, unknown>, event_data?: unknown) => Promise<SubmitReturn>;
|
44
52
|
type event = <K extends EventType>(eventType: K, listener: EventListener<K>) => SubmitReturn;
|
45
|
-
type predict = (endpoint: string | number, data?: unknown[], event_data?: unknown) => Promise<unknown>;
|
46
53
|
export type client_return = {
|
47
54
|
config: Config | undefined;
|
48
|
-
predict:
|
49
|
-
submit:
|
55
|
+
predict: PredictFunction;
|
56
|
+
submit: SubmitFunction;
|
50
57
|
component_server: (component_id: number, fn_name: string, data: unknown[]) => any;
|
51
58
|
view_api: (_fetch: typeof fetch) => Promise<ApiInfo<JsApiData>>;
|
52
59
|
};
|
@@ -165,11 +172,12 @@ export interface FileData {
|
|
165
172
|
mime_type?: string;
|
166
173
|
alt_text?: string;
|
167
174
|
}
|
168
|
-
export type EventType = "data" | "status" | "log";
|
175
|
+
export type EventType = "data" | "status" | "log" | "render";
|
169
176
|
export interface EventMap {
|
170
177
|
data: Payload;
|
171
178
|
status: Status;
|
172
179
|
log: LogMessage;
|
180
|
+
render: RenderMessage;
|
173
181
|
}
|
174
182
|
export type Event<K extends EventType> = {
|
175
183
|
[P in K]: EventMap[P] & {
|
@@ -186,6 +194,13 @@ export interface LogMessage {
|
|
186
194
|
log: string;
|
187
195
|
level: "warning" | "info";
|
188
196
|
}
|
197
|
+
export interface RenderMessage {
|
198
|
+
fn_index: number;
|
199
|
+
data: {
|
200
|
+
components: any[];
|
201
|
+
layout: any;
|
202
|
+
};
|
203
|
+
}
|
189
204
|
export interface Status {
|
190
205
|
queue: boolean;
|
191
206
|
code?: string;
|
package/dist/types.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,OAAO;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE;QACL,IAAI,EAAE,GAAG,CAAC;QACV,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,SAAS;IAC1D,UAAU,EAAE,CAAC,EAAE,CAAC;IAChB,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,IAAI,CAAC,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,SAAS;IACrD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;CAC1B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;AAIrE,
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,WAAW,OAAO;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,IAAI,EAAE;QACL,IAAI,EAAE,GAAG,CAAC;QACV,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IACnD,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACnD;AAED,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,SAAS;IAC1D,UAAU,EAAE,CAAC,EAAE,CAAC;IAChB,OAAO,EAAE,CAAC,EAAE,CAAC;IACb,IAAI,CAAC,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,OAAO,GAAG,SAAS;IACrD,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,OAAO;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,CAAC;CAC1B;AAED,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;AAIrE,MAAM,MAAM,cAAc,GAAG,CAC5B,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,UAAU,CAAC,EAAE,OAAO,EACpB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,KACtB,YAAY,CAAC;AAElB,MAAM,MAAM,eAAe,GAAG,CAC7B,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,UAAU,CAAC,EAAE,OAAO,KAChB,OAAO,CAAC,YAAY,CAAC,CAAC;AAI3B,KAAK,KAAK,GAAG,CAAC,CAAC,SAAS,SAAS,EAChC,SAAS,EAAE,CAAC,EACZ,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KACtB,YAAY,CAAC;AAElB,MAAM,MAAM,aAAa,GAAG;IAC3B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,cAAc,CAAC;IACvB,gBAAgB,EAAE,CACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,OAAO,EAAE,KACX,GAAG,CAAC;IACT,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;CAChE,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IAC1B,EAAE,EAAE,KAAK,CAAC;IACV,GAAG,EAAE,KAAK,CAAC;IACX,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;CACpB,CAAC;AAIF,MAAM,MAAM,WAAW,GAAG,iBAAiB,GAAG,gBAAgB,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,SAAS,CAAC;IAClE,MAAM,EACH,UAAU,GACV,SAAS,GACT,kBAAkB,GAClB,UAAU,GACV,WAAW,CAAC;IACf,WAAW,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,aAAa,GAAG,QAAQ,CAAC;IACjC,MAAM,EACH,aAAa,GACb,cAAc,GACd,aAAa,GACb,eAAe,GACf,QAAQ,CAAC;IACZ,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,WAAW,KAAK,IAAI,CAAC;AAI3D,MAAM,WAAW,MAAM;IACtB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,GAAG,EAAE,CAAC;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,EAAE,GAAG,CAAC;IACZ,IAAI,EAAE,QAAQ,GAAG,WAAW,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,IAAI,CAAC;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,UAAU;IAC1B,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;IAC7C,WAAW,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,eAAe,CAAC;IACvB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,YAAY,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,CAAC;IAClD,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC/B,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAID,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,EAAE,MAAM,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAAC;CAC7C;AAED,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAID,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,QAAQ;IACxB,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,UAAU,CAAC;IAChB,MAAM,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,IAAI;KACvC,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CACvE,CAAC,CAAC,CAAC,CAAC;AACL,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,SAAS,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAC3E,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,SAAS,IAAI;KAC7C,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE;CAC7B,CAAC;AACF,MAAM,WAAW,UAAU;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,SAAS,GAAG,MAAM,CAAC;CAC1B;AACD,MAAM,WAAW,aAAa;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QACL,UAAU,EAAE,GAAG,EAAE,CAAC;QAClB,MAAM,EAAE,GAAG,CAAC;KACZ,CAAC;CACF;AAED,MAAM,WAAW,MAAM;IACtB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,YAAY,CAAC;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE;QACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;KACpB,EAAE,CAAC;IACJ,IAAI,CAAC,EAAE,IAAI,CAAC;CACZ"}
|
package/dist/utils/predict.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
import { Client } from "../client";
|
2
2
|
import type { SubmitReturn } from "../types";
|
3
|
-
export declare function predict(this: Client, endpoint: string | number, data
|
3
|
+
export declare function predict(this: Client, endpoint: string | number, data: unknown[] | Record<string, unknown>): Promise<SubmitReturn>;
|
4
4
|
//# sourceMappingURL=predict.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"predict.d.ts","sourceRoot":"","sources":["../../src/utils/predict.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,UAAU,CAAC;AAEzD,wBAAsB,OAAO,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,IAAI,CAAC,EAAE,OAAO,
|
1
|
+
{"version":3,"file":"predict.d.ts","sourceRoot":"","sources":["../../src/utils/predict.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,KAAK,EAAc,YAAY,EAAE,MAAM,UAAU,CAAC;AAEzD,wBAAsB,OAAO,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACvC,OAAO,CAAC,YAAY,CAAC,CAgDvB"}
|
package/dist/utils/stream.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import type { Client } from "../client";
|
2
|
-
export declare function open_stream(this: Client): void
|
2
|
+
export declare function open_stream(this: Client): Promise<void>;
|
3
3
|
export declare function close_stream(stream_status: {
|
4
4
|
open: boolean;
|
5
5
|
}, stream: EventSource | null): void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/utils/stream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/utils/stream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAExC,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkF7D;AAED,wBAAgB,YAAY,CAC3B,aAAa,EAAE;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,EAChC,MAAM,EAAE,WAAW,GAAG,IAAI,GACxB,IAAI,CAKN;AAED,wBAAgB,iBAAiB,CAChC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,EAC7C,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GACP,IAAI,CAcN;AAED,wBAAgB,UAAU,CACzB,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,GACxC,GAAG,CAML"}
|
package/dist/utils/submit.d.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
import type { SubmitReturn } from "../types";
|
2
2
|
import { Client } from "../client";
|
3
|
-
export declare function submit(this: Client, endpoint: string | number, data: unknown[], event_data?: unknown, trigger_id?: number | null): SubmitReturn;
|
3
|
+
export declare function submit(this: Client, endpoint: string | number, data: unknown[] | Record<string, unknown>, event_data?: unknown, trigger_id?: number | null): SubmitReturn;
|
4
4
|
//# sourceMappingURL=submit.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../../src/utils/submit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKX,YAAY,EAQZ,MAAM,UAAU,CAAC;
|
1
|
+
{"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../../src/utils/submit.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAKX,YAAY,EAQZ,MAAM,UAAU,CAAC;AAYlB,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAEnC,wBAAgB,MAAM,CACrB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,IAAI,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,UAAU,CAAC,EAAE,OAAO,EACpB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,YAAY,CAmoBd"}
|
package/package.json
CHANGED
package/src/client.ts
CHANGED
@@ -59,19 +59,18 @@ export class Client {
|
|
59
59
|
return fetch(input, init);
|
60
60
|
}
|
61
61
|
|
62
|
-
|
62
|
+
async stream(url: URL): Promise<EventSource> {
|
63
63
|
if (typeof window === "undefined" || typeof EventSource === "undefined") {
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
.
|
69
|
-
|
70
|
-
|
64
|
+
try {
|
65
|
+
const EventSourceModule = await import("eventsource");
|
66
|
+
return new EventSourceModule.default(url.toString()) as EventSource;
|
67
|
+
} catch (error) {
|
68
|
+
console.error("Failed to load EventSource module:", error);
|
69
|
+
throw error;
|
70
|
+
}
|
71
71
|
} else {
|
72
72
|
return new EventSource(url.toString());
|
73
73
|
}
|
74
|
-
return null;
|
75
74
|
}
|
76
75
|
|
77
76
|
view_api: () => Promise<ApiInfo<JsApiData>>;
|
@@ -98,16 +97,16 @@ export class Client {
|
|
98
97
|
) => Promise<unknown[]>;
|
99
98
|
submit: (
|
100
99
|
endpoint: string | number,
|
101
|
-
data: unknown[],
|
100
|
+
data: unknown[] | Record<string, unknown>,
|
102
101
|
event_data?: unknown,
|
103
102
|
trigger_id?: number | null
|
104
103
|
) => SubmitReturn;
|
105
104
|
predict: (
|
106
105
|
endpoint: string | number,
|
107
|
-
data
|
106
|
+
data: unknown[] | Record<string, unknown>,
|
108
107
|
event_data?: unknown
|
109
|
-
) => Promise<
|
110
|
-
open_stream: () => void
|
108
|
+
) => Promise<SubmitReturn>;
|
109
|
+
open_stream: () => Promise<void>;
|
111
110
|
private resolve_config: (endpoint: string) => Promise<Config | undefined>;
|
112
111
|
constructor(app_reference: string, options: ClientOptions = {}) {
|
113
112
|
this.app_reference = app_reference;
|
@@ -140,18 +139,24 @@ export class Client {
|
|
140
139
|
if (config) {
|
141
140
|
this.config = config;
|
142
141
|
if (this.config && this.config.connect_heartbeat) {
|
143
|
-
// connect to the heartbeat endpoint via GET request
|
144
|
-
const heartbeat_url = new URL(
|
145
|
-
`${this.config.root}/heartbeat/${this.session_hash}`
|
146
|
-
);
|
147
|
-
this.heartbeat_event = this.stream_factory(heartbeat_url); // Just connect to the endpoint without parsing the response. Ref: https://github.com/gradio-app/gradio/pull/7974#discussion_r1557717540
|
148
|
-
|
149
142
|
if (this.config.space_id && this.options.hf_token) {
|
150
143
|
this.jwt = await get_jwt(
|
151
144
|
this.config.space_id,
|
152
145
|
this.options.hf_token
|
153
146
|
);
|
154
147
|
}
|
148
|
+
|
149
|
+
// connect to the heartbeat endpoint via GET request
|
150
|
+
const heartbeat_url = new URL(
|
151
|
+
`${this.config.root}/heartbeat/${this.session_hash}`
|
152
|
+
);
|
153
|
+
|
154
|
+
// if the jwt is available, add it to the query params
|
155
|
+
if (this.jwt) {
|
156
|
+
heartbeat_url.searchParams.set("jwt", this.jwt);
|
157
|
+
}
|
158
|
+
|
159
|
+
this.heartbeat_event = await this.stream(heartbeat_url); // Just connect to the endpoint without parsing the response. Ref: https://github.com/gradio-app/gradio/pull/7974#discussion_r1557717540
|
155
160
|
}
|
156
161
|
}
|
157
162
|
});
|
package/src/helpers/api_info.ts
CHANGED
@@ -77,7 +77,11 @@ export function transform_api_info(
|
|
77
77
|
Object.entries(api_info[category]).forEach(
|
78
78
|
([endpoint, { parameters, returns }]) => {
|
79
79
|
const dependencyIndex =
|
80
|
-
config.dependencies.findIndex(
|
80
|
+
config.dependencies.findIndex(
|
81
|
+
(dep) =>
|
82
|
+
dep.api_name === endpoint ||
|
83
|
+
dep.api_name === endpoint.replace("/", "")
|
84
|
+
) ||
|
81
85
|
api_map[endpoint.replace("/", "")] ||
|
82
86
|
-1;
|
83
87
|
|
@@ -86,6 +90,34 @@ export function transform_api_info(
|
|
86
90
|
? config.dependencies[dependencyIndex].types
|
87
91
|
: { continuous: false, generator: false };
|
88
92
|
|
93
|
+
if (
|
94
|
+
dependencyIndex !== -1 &&
|
95
|
+
config.dependencies[dependencyIndex]?.inputs?.length !==
|
96
|
+
parameters.length
|
97
|
+
) {
|
98
|
+
const components = config.dependencies[dependencyIndex].inputs.map(
|
99
|
+
(input) => config.components.find((c) => c.id === input)?.type
|
100
|
+
);
|
101
|
+
|
102
|
+
try {
|
103
|
+
components.forEach((comp, idx) => {
|
104
|
+
if (comp === "state") {
|
105
|
+
const new_param = {
|
106
|
+
component: "state",
|
107
|
+
example: null,
|
108
|
+
parameter_default: null,
|
109
|
+
parameter_has_default: true,
|
110
|
+
parameter_name: null,
|
111
|
+
hidden: true
|
112
|
+
};
|
113
|
+
|
114
|
+
// @ts-ignore
|
115
|
+
parameters.splice(idx, 0, new_param);
|
116
|
+
}
|
117
|
+
});
|
118
|
+
} catch (e) {}
|
119
|
+
}
|
120
|
+
|
89
121
|
const transform_type = (
|
90
122
|
data: ApiData,
|
91
123
|
component: string,
|
@@ -93,17 +125,17 @@ export function transform_api_info(
|
|
93
125
|
signature_type: "return" | "parameter"
|
94
126
|
): JsApiData => ({
|
95
127
|
...data,
|
96
|
-
description: get_description(data
|
128
|
+
description: get_description(data?.type, serializer),
|
97
129
|
type:
|
98
|
-
get_type(data
|
130
|
+
get_type(data?.type, component, serializer, signature_type) || ""
|
99
131
|
});
|
100
132
|
|
101
133
|
transformed_info[category][endpoint] = {
|
102
134
|
parameters: parameters.map((p: ApiData) =>
|
103
|
-
transform_type(p, p
|
135
|
+
transform_type(p, p?.component, p?.serializer, "parameter")
|
104
136
|
),
|
105
137
|
returns: returns.map((r: ApiData) =>
|
106
|
-
transform_type(r, r
|
138
|
+
transform_type(r, r?.component, r?.serializer, "return")
|
107
139
|
),
|
108
140
|
type: dependencyTypes
|
109
141
|
};
|
@@ -121,7 +153,7 @@ export function get_type(
|
|
121
153
|
serializer: string,
|
122
154
|
signature_type: "return" | "parameter"
|
123
155
|
): string | undefined {
|
124
|
-
switch (type
|
156
|
+
switch (type?.type) {
|
125
157
|
case "string":
|
126
158
|
return "string";
|
127
159
|
case "boolean":
|
@@ -166,7 +198,7 @@ export function get_description(
|
|
166
198
|
} else if (serializer === "FileSerializable") {
|
167
199
|
return "array of files or single file";
|
168
200
|
}
|
169
|
-
return type
|
201
|
+
return type?.description;
|
170
202
|
}
|
171
203
|
|
172
204
|
export function handle_message(
|
@@ -298,3 +330,74 @@ export function handle_message(
|
|
298
330
|
|
299
331
|
return { type: "none", status: { stage: "error", queue } };
|
300
332
|
}
|
333
|
+
|
334
|
+
/**
|
335
|
+
* Maps the provided `data` to the parameters defined by the `/info` endpoint response.
|
336
|
+
* This allows us to support both positional and keyword arguments passed to the client
|
337
|
+
* and ensures that all parameters are either directly provided or have default values assigned.
|
338
|
+
*
|
339
|
+
* @param {unknown[] | Record<string, unknown>} data - The input data for the function,
|
340
|
+
* which can be either an array of values for positional arguments or an object
|
341
|
+
* with key-value pairs for keyword arguments.
|
342
|
+
* @param {JsApiData[]} parameters - Array of parameter descriptions retrieved from the
|
343
|
+
* `/info` endpoint.
|
344
|
+
*
|
345
|
+
* @returns {unknown[]} - Returns an array of resolved data where each element corresponds
|
346
|
+
* to the expected parameter from the API. The `parameter_default` value is used where
|
347
|
+
* a value is not provided for a parameter, and optional parameters without defaults are
|
348
|
+
* set to `undefined`.
|
349
|
+
*
|
350
|
+
* @throws {Error} - Throws an error:
|
351
|
+
* - If more arguments are provided than are defined in the parameters.
|
352
|
+
* * - If no parameter value is provided for a required parameter and no default value is defined.
|
353
|
+
* - If an argument is provided that does not match any defined parameter.
|
354
|
+
*/
|
355
|
+
|
356
|
+
export const map_data_to_params = (
|
357
|
+
data: unknown[] | Record<string, unknown>,
|
358
|
+
api_info: ApiInfo<JsApiData | ApiData>
|
359
|
+
): unknown[] => {
|
360
|
+
const parameters = Object.values(api_info.named_endpoints).flatMap(
|
361
|
+
(values) => values.parameters
|
362
|
+
);
|
363
|
+
|
364
|
+
if (Array.isArray(data)) {
|
365
|
+
if (data.length > parameters.length) {
|
366
|
+
console.warn("Too many arguments provided for the endpoint.");
|
367
|
+
}
|
368
|
+
return data;
|
369
|
+
}
|
370
|
+
|
371
|
+
const resolved_data: unknown[] = [];
|
372
|
+
const provided_keys = Object.keys(data);
|
373
|
+
|
374
|
+
parameters.forEach((param, index) => {
|
375
|
+
if (data.hasOwnProperty(param.parameter_name)) {
|
376
|
+
resolved_data[index] = data[param.parameter_name];
|
377
|
+
} else if (param.parameter_has_default) {
|
378
|
+
resolved_data[index] = param.parameter_default;
|
379
|
+
} else {
|
380
|
+
throw new Error(
|
381
|
+
`No value provided for required parameter: ${param.parameter_name}`
|
382
|
+
);
|
383
|
+
}
|
384
|
+
});
|
385
|
+
|
386
|
+
provided_keys.forEach((key) => {
|
387
|
+
if (!parameters.some((param) => param.parameter_name === key)) {
|
388
|
+
throw new Error(
|
389
|
+
`Parameter \`${key}\` is not a valid keyword argument. Please refer to the API for usage.`
|
390
|
+
);
|
391
|
+
}
|
392
|
+
});
|
393
|
+
|
394
|
+
resolved_data.forEach((value, idx) => {
|
395
|
+
if (value === undefined && !parameters[idx].parameter_has_default) {
|
396
|
+
throw new Error(
|
397
|
+
`No value provided for required parameter: ${parameters[idx].parameter_name}`
|
398
|
+
);
|
399
|
+
}
|
400
|
+
});
|
401
|
+
|
402
|
+
return resolved_data;
|
403
|
+
};
|
@@ -4,9 +4,11 @@ import {
|
|
4
4
|
handle_message,
|
5
5
|
get_description,
|
6
6
|
get_type,
|
7
|
-
process_endpoint
|
7
|
+
process_endpoint,
|
8
|
+
map_data_to_params
|
8
9
|
} from "../helpers/api_info";
|
9
10
|
import { initialise_server } from "./server";
|
11
|
+
import { transformed_api_info } from "./test_data";
|
10
12
|
|
11
13
|
const server = initialise_server();
|
12
14
|
|
@@ -454,3 +456,112 @@ describe("process_endpoint", () => {
|
|
454
456
|
expect(result).toEqual(expected);
|
455
457
|
});
|
456
458
|
});
|
459
|
+
|
460
|
+
describe("map_data_params", () => {
|
461
|
+
let test_data = transformed_api_info;
|
462
|
+
|
463
|
+
test_data.named_endpoints["/predict"].parameters = [
|
464
|
+
{
|
465
|
+
parameter_name: "param1",
|
466
|
+
parameter_has_default: false,
|
467
|
+
label: "",
|
468
|
+
component: "",
|
469
|
+
serializer: "",
|
470
|
+
python_type: {
|
471
|
+
type: "",
|
472
|
+
description: ""
|
473
|
+
},
|
474
|
+
type: {
|
475
|
+
type: "",
|
476
|
+
description: ""
|
477
|
+
}
|
478
|
+
},
|
479
|
+
{
|
480
|
+
parameter_name: "param2",
|
481
|
+
parameter_has_default: false,
|
482
|
+
label: "",
|
483
|
+
type: {
|
484
|
+
type: "",
|
485
|
+
description: ""
|
486
|
+
},
|
487
|
+
component: "",
|
488
|
+
serializer: "",
|
489
|
+
python_type: {
|
490
|
+
type: "",
|
491
|
+
description: ""
|
492
|
+
}
|
493
|
+
},
|
494
|
+
{
|
495
|
+
parameter_name: "param3",
|
496
|
+
parameter_has_default: true,
|
497
|
+
parameter_default: 3,
|
498
|
+
label: "",
|
499
|
+
type: {
|
500
|
+
type: "",
|
501
|
+
description: ""
|
502
|
+
},
|
503
|
+
component: "",
|
504
|
+
serializer: "",
|
505
|
+
python_type: {
|
506
|
+
type: "",
|
507
|
+
description: ""
|
508
|
+
}
|
509
|
+
}
|
510
|
+
];
|
511
|
+
|
512
|
+
it("should return an array of data when data is an array", () => {
|
513
|
+
const data = [1, 2];
|
514
|
+
|
515
|
+
const result = map_data_to_params(data, transformed_api_info);
|
516
|
+
expect(result).toEqual(data);
|
517
|
+
});
|
518
|
+
|
519
|
+
it("should return the data when too many arguments are provided for the endpoint", () => {
|
520
|
+
const data = [1, 2, 3, 4];
|
521
|
+
|
522
|
+
const result = map_data_to_params(data, transformed_api_info);
|
523
|
+
expect(result).toEqual(data);
|
524
|
+
});
|
525
|
+
|
526
|
+
it("should return an array of resolved data when data is an object", () => {
|
527
|
+
const data = {
|
528
|
+
param1: 1,
|
529
|
+
param2: 2,
|
530
|
+
param3: 3
|
531
|
+
};
|
532
|
+
|
533
|
+
const result = map_data_to_params(data, transformed_api_info);
|
534
|
+
expect(result).toEqual([1, 2, 3]);
|
535
|
+
});
|
536
|
+
|
537
|
+
it("should use the default value when a keyword argument is not provided and has a default value", () => {
|
538
|
+
const data = {
|
539
|
+
param1: 1,
|
540
|
+
param2: 2
|
541
|
+
};
|
542
|
+
|
543
|
+
const result = map_data_to_params(data, transformed_api_info);
|
544
|
+
expect(result).toEqual([1, 2, 3]);
|
545
|
+
});
|
546
|
+
|
547
|
+
it("should throw an error when an invalid keyword argument is provided", () => {
|
548
|
+
const data = {
|
549
|
+
param1: 1,
|
550
|
+
param2: 2,
|
551
|
+
param3: 3,
|
552
|
+
param4: 4
|
553
|
+
};
|
554
|
+
|
555
|
+
expect(() => map_data_to_params(data, transformed_api_info)).toThrowError(
|
556
|
+
"Parameter `param4` is not a valid keyword argument. Please refer to the API for usage."
|
557
|
+
);
|
558
|
+
});
|
559
|
+
|
560
|
+
it("should throw an error when no value is provided for a required parameter", () => {
|
561
|
+
const data = {};
|
562
|
+
|
563
|
+
expect(() => map_data_to_params(data, transformed_api_info)).toThrowError(
|
564
|
+
"No value provided for required parameter: param1"
|
565
|
+
);
|
566
|
+
});
|
567
|
+
});
|
@@ -1,11 +1,13 @@
|
|
1
1
|
import { vi } from "vitest";
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
})
|
3
|
+
if (process.env.TEST_MODE !== "node") {
|
4
|
+
Object.defineProperty(window, "EventSource", {
|
5
|
+
writable: true,
|
6
|
+
value: vi.fn().mockImplementation(() => ({
|
7
|
+
close: vi.fn(() => {}),
|
8
|
+
addEventListener: vi.fn(),
|
9
|
+
onmessage: vi.fn((_event: MessageEvent) => {}),
|
10
|
+
onerror: vi.fn((_event: Event) => {})
|
11
|
+
}))
|
12
|
+
});
|
13
|
+
}
|
package/src/test/stream.test.ts
CHANGED
@@ -1,11 +1,21 @@
|
|
1
|
-
import { vi } from "vitest";
|
1
|
+
import { vi, type Mock } from "vitest";
|
2
2
|
import { Client } from "../client";
|
3
3
|
import { initialise_server } from "./server";
|
4
4
|
|
5
|
-
import {
|
5
|
+
import {
|
6
|
+
describe,
|
7
|
+
it,
|
8
|
+
expect,
|
9
|
+
afterEach,
|
10
|
+
beforeAll,
|
11
|
+
afterAll,
|
12
|
+
beforeEach
|
13
|
+
} from "vitest";
|
6
14
|
import "./mock_eventsource.ts";
|
15
|
+
import NodeEventSource from "eventsource";
|
7
16
|
|
8
17
|
const server = initialise_server();
|
18
|
+
const IS_NODE = process.env.TEST_MODE === "node";
|
9
19
|
|
10
20
|
beforeAll(() => server.listen());
|
11
21
|
afterEach(() => server.resetHandlers());
|
@@ -13,12 +23,14 @@ afterAll(() => server.close());
|
|
13
23
|
|
14
24
|
describe("open_stream", () => {
|
15
25
|
let mock_eventsource: any;
|
16
|
-
let app:
|
26
|
+
let app: Client;
|
17
27
|
|
18
28
|
beforeEach(async () => {
|
19
29
|
app = await Client.connect("hmb/hello_world");
|
20
|
-
app.
|
21
|
-
mock_eventsource =
|
30
|
+
app.stream = vi.fn().mockImplementation(() => {
|
31
|
+
mock_eventsource = IS_NODE
|
32
|
+
? new NodeEventSource("")
|
33
|
+
: new EventSource("");
|
22
34
|
return mock_eventsource;
|
23
35
|
});
|
24
36
|
});
|
@@ -30,21 +42,21 @@ describe("open_stream", () => {
|
|
30
42
|
it("should throw an error if config is not defined", () => {
|
31
43
|
app.config = undefined;
|
32
44
|
|
33
|
-
expect(() => {
|
34
|
-
app.open_stream();
|
35
|
-
}).toThrow("Could not resolve app config");
|
45
|
+
expect(async () => {
|
46
|
+
await app.open_stream();
|
47
|
+
}).rejects.toThrow("Could not resolve app config");
|
36
48
|
});
|
37
49
|
|
38
50
|
it("should connect to the SSE endpoint and handle messages", async () => {
|
39
|
-
app.open_stream();
|
51
|
+
await app.open_stream();
|
40
52
|
|
41
|
-
const eventsource_mock_call = app.
|
53
|
+
const eventsource_mock_call = (app.stream as Mock).mock.calls[0][0];
|
42
54
|
|
43
55
|
expect(eventsource_mock_call.href).toMatch(
|
44
56
|
/https:\/\/hmb-hello-world\.hf\.space\/queue\/data\?session_hash/
|
45
57
|
);
|
46
58
|
|
47
|
-
expect(app.
|
59
|
+
expect(app.stream).toHaveBeenCalledWith(eventsource_mock_call);
|
48
60
|
|
49
61
|
const onMessageCallback = mock_eventsource.onmessage;
|
50
62
|
const onErrorCallback = mock_eventsource.onerror;
|
package/src/types.ts
CHANGED
@@ -4,6 +4,9 @@ import { hardware_types } from "./helpers/spaces";
|
|
4
4
|
|
5
5
|
export interface ApiData {
|
6
6
|
label: string;
|
7
|
+
parameter_name: string;
|
8
|
+
parameter_default?: any;
|
9
|
+
parameter_has_default?: boolean;
|
7
10
|
type: {
|
8
11
|
type: any;
|
9
12
|
description: string;
|
@@ -16,6 +19,9 @@ export interface ApiData {
|
|
16
19
|
|
17
20
|
export interface JsApiData {
|
18
21
|
label: string;
|
22
|
+
parameter_name: string;
|
23
|
+
parameter_default?: any;
|
24
|
+
parameter_has_default?: boolean;
|
19
25
|
type: string;
|
20
26
|
description: string;
|
21
27
|
component: string;
|
@@ -43,6 +49,21 @@ export interface BlobRef {
|
|
43
49
|
|
44
50
|
export type DataType = string | Buffer | Record<string, any> | any[];
|
45
51
|
|
52
|
+
// Function Signature Types
|
53
|
+
|
54
|
+
export type SubmitFunction = (
|
55
|
+
endpoint: string | number,
|
56
|
+
data: unknown[] | Record<string, unknown>,
|
57
|
+
event_data?: unknown,
|
58
|
+
trigger_id?: number | null
|
59
|
+
) => SubmitReturn;
|
60
|
+
|
61
|
+
export type PredictFunction = (
|
62
|
+
endpoint: string | number,
|
63
|
+
data: unknown[] | Record<string, unknown>,
|
64
|
+
event_data?: unknown
|
65
|
+
) => Promise<SubmitReturn>;
|
66
|
+
|
46
67
|
// Event and Submission Types
|
47
68
|
|
48
69
|
type event = <K extends EventType>(
|
@@ -50,21 +71,10 @@ type event = <K extends EventType>(
|
|
50
71
|
listener: EventListener<K>
|
51
72
|
) => SubmitReturn;
|
52
73
|
|
53
|
-
type predict = (
|
54
|
-
endpoint: string | number,
|
55
|
-
data?: unknown[],
|
56
|
-
event_data?: unknown
|
57
|
-
) => Promise<unknown>;
|
58
|
-
|
59
74
|
export type client_return = {
|
60
75
|
config: Config | undefined;
|
61
|
-
predict:
|
62
|
-
submit:
|
63
|
-
endpoint: string | number,
|
64
|
-
data: unknown[],
|
65
|
-
event_data?: unknown,
|
66
|
-
trigger_id?: number | null
|
67
|
-
) => SubmitReturn;
|
76
|
+
predict: PredictFunction;
|
77
|
+
submit: SubmitFunction;
|
68
78
|
component_server: (
|
69
79
|
component_id: number,
|
70
80
|
fn_name: string,
|
@@ -220,12 +230,13 @@ export interface FileData {
|
|
220
230
|
|
221
231
|
// Event and Listener Types
|
222
232
|
|
223
|
-
export type EventType = "data" | "status" | "log";
|
233
|
+
export type EventType = "data" | "status" | "log" | "render";
|
224
234
|
|
225
235
|
export interface EventMap {
|
226
236
|
data: Payload;
|
227
237
|
status: Status;
|
228
238
|
log: LogMessage;
|
239
|
+
render: RenderMessage;
|
229
240
|
}
|
230
241
|
|
231
242
|
export type Event<K extends EventType> = {
|
@@ -239,6 +250,13 @@ export interface LogMessage {
|
|
239
250
|
log: string;
|
240
251
|
level: "warning" | "info";
|
241
252
|
}
|
253
|
+
export interface RenderMessage {
|
254
|
+
fn_index: number;
|
255
|
+
data: {
|
256
|
+
components: any[];
|
257
|
+
layout: any;
|
258
|
+
};
|
259
|
+
}
|
242
260
|
|
243
261
|
export interface Status {
|
244
262
|
queue: boolean;
|
package/src/utils/predict.ts
CHANGED
@@ -4,7 +4,7 @@ import type { Dependency, SubmitReturn } from "../types";
|
|
4
4
|
export async function predict(
|
5
5
|
this: Client,
|
6
6
|
endpoint: string | number,
|
7
|
-
data
|
7
|
+
data: unknown[] | Record<string, unknown>
|
8
8
|
): Promise<SubmitReturn> {
|
9
9
|
let data_returned = false;
|
10
10
|
let status_complete = false;
|
@@ -28,7 +28,7 @@ export async function predict(
|
|
28
28
|
}
|
29
29
|
|
30
30
|
return new Promise(async (resolve, reject) => {
|
31
|
-
const app = this.submit(endpoint, data
|
31
|
+
const app = this.submit(endpoint, data);
|
32
32
|
let result: unknown;
|
33
33
|
|
34
34
|
app
|
package/src/utils/stream.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
import { BROKEN_CONNECTION_MSG } from "../constants";
|
2
2
|
import type { Client } from "../client";
|
3
3
|
|
4
|
-
export function open_stream(this: Client): void {
|
4
|
+
export async function open_stream(this: Client): Promise<void> {
|
5
5
|
let {
|
6
6
|
event_callbacks,
|
7
7
|
unclosed_events,
|
@@ -28,7 +28,7 @@ export function open_stream(this: Client): void {
|
|
28
28
|
url.searchParams.set("__sign", jwt);
|
29
29
|
}
|
30
30
|
|
31
|
-
stream = this.
|
31
|
+
stream = await this.stream(url);
|
32
32
|
|
33
33
|
if (!stream) {
|
34
34
|
console.warn("Cannot connect to SSE endpoint: " + url.toString());
|
package/src/utils/submit.ts
CHANGED
@@ -16,7 +16,12 @@ import type {
|
|
16
16
|
|
17
17
|
import { skip_queue, post_message } from "../helpers/data";
|
18
18
|
import { resolve_root } from "../helpers/init_helpers";
|
19
|
-
import {
|
19
|
+
import {
|
20
|
+
handle_message,
|
21
|
+
map_data_to_params,
|
22
|
+
process_endpoint
|
23
|
+
} from "../helpers/api_info";
|
24
|
+
import semiver from "semiver";
|
20
25
|
import { BROKEN_CONNECTION_MSG, QUEUE_FULL_MSG } from "../constants";
|
21
26
|
import { apply_diff_stream, close_stream } from "./stream";
|
22
27
|
import { Client } from "../client";
|
@@ -24,7 +29,7 @@ import { Client } from "../client";
|
|
24
29
|
export function submit(
|
25
30
|
this: Client,
|
26
31
|
endpoint: string | number,
|
27
|
-
data: unknown[],
|
32
|
+
data: unknown[] | Record<string, unknown>,
|
28
33
|
event_data?: unknown,
|
29
34
|
trigger_id?: number | null
|
30
35
|
): SubmitReturn {
|
@@ -55,6 +60,8 @@ export function submit(
|
|
55
60
|
config
|
56
61
|
);
|
57
62
|
|
63
|
+
let resolved_data = map_data_to_params(data, api_info);
|
64
|
+
|
58
65
|
let websocket: WebSocket;
|
59
66
|
let stream: EventSource | null;
|
60
67
|
let protocol = config.protocol ?? "ws";
|
@@ -155,7 +162,7 @@ export function submit(
|
|
155
162
|
}
|
156
163
|
}
|
157
164
|
|
158
|
-
this.handle_blob(config.root,
|
165
|
+
this.handle_blob(config.root, resolved_data, endpoint_info).then(
|
159
166
|
async (_payload) => {
|
160
167
|
payload = {
|
161
168
|
data: _payload || [],
|
@@ -372,7 +379,7 @@ export function submit(
|
|
372
379
|
url.searchParams.set("__sign", this.jwt);
|
373
380
|
}
|
374
381
|
|
375
|
-
stream = this.
|
382
|
+
stream = await this.stream(url);
|
376
383
|
|
377
384
|
if (!stream) {
|
378
385
|
return Promise.reject(
|
@@ -503,7 +510,7 @@ export function submit(
|
|
503
510
|
headers
|
504
511
|
);
|
505
512
|
});
|
506
|
-
post_data_promise.then(([response, status]: any) => {
|
513
|
+
post_data_promise.then(async ([response, status]: any) => {
|
507
514
|
if (status === 503) {
|
508
515
|
fire_event({
|
509
516
|
type: "status",
|
@@ -594,6 +601,14 @@ export function submit(
|
|
594
601
|
endpoint: _endpoint,
|
595
602
|
fn_index
|
596
603
|
});
|
604
|
+
if (data.render_config) {
|
605
|
+
fire_event({
|
606
|
+
type: "render",
|
607
|
+
data: data.render_config,
|
608
|
+
endpoint: _endpoint,
|
609
|
+
fn_index
|
610
|
+
});
|
611
|
+
}
|
597
612
|
|
598
613
|
if (complete) {
|
599
614
|
fire_event({
|
@@ -647,7 +662,7 @@ export function submit(
|
|
647
662
|
event_callbacks[event_id] = callback;
|
648
663
|
unclosed_events.add(event_id);
|
649
664
|
if (!stream_status.open) {
|
650
|
-
this.open_stream();
|
665
|
+
await this.open_stream();
|
651
666
|
}
|
652
667
|
}
|
653
668
|
});
|