@gradio/client 0.18.0 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -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 +65 -16
- 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 +13 -14
- package/src/helpers/api_info.ts +71 -0
- 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,16 @@
|
|
1
1
|
# @gradio/client
|
2
2
|
|
3
|
+
## 0.19.0
|
4
|
+
|
5
|
+
### Features
|
6
|
+
|
7
|
+
- [#8110](https://github.com/gradio-app/gradio/pull/8110) [`5436031`](https://github.com/gradio-app/gradio/commit/5436031f92c1596282eb64e1e74d555f279e9697) - Render decorator 2. Thanks @aliabid94!
|
8
|
+
- [#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!
|
9
|
+
|
10
|
+
### Fixes
|
11
|
+
|
12
|
+
- [#8252](https://github.com/gradio-app/gradio/pull/8252) [`22df61a`](https://github.com/gradio-app/gradio/commit/22df61a26adf8023f6dd49c051979990e8d3879a) - Client node fix. Thanks @pngwn!
|
13
|
+
|
3
14
|
## 0.18.0
|
4
15
|
|
5
16
|
### 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,CAiDpB;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"}
|
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,CAiDpB;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);
|
@@ -317,6 +317,45 @@ function handle_message(data, last_status) {
|
|
317
317
|
}
|
318
318
|
return { type: "none", status: { stage: "error", queue } };
|
319
319
|
}
|
320
|
+
const map_data_to_params = (data, api_info) => {
|
321
|
+
const parameters = Object.values(api_info.named_endpoints).flatMap(
|
322
|
+
(values) => values.parameters
|
323
|
+
);
|
324
|
+
if (Array.isArray(data)) {
|
325
|
+
if (data.length > parameters.length) {
|
326
|
+
console.warn("Too many arguments provided for the endpoint.");
|
327
|
+
}
|
328
|
+
return data;
|
329
|
+
}
|
330
|
+
const resolved_data = [];
|
331
|
+
const provided_keys = Object.keys(data);
|
332
|
+
parameters.forEach((param, index) => {
|
333
|
+
if (data.hasOwnProperty(param.parameter_name)) {
|
334
|
+
resolved_data[index] = data[param.parameter_name];
|
335
|
+
} else if (param.parameter_has_default) {
|
336
|
+
resolved_data[index] = param.parameter_default;
|
337
|
+
} else {
|
338
|
+
throw new Error(
|
339
|
+
`No value provided for required parameter: ${param.parameter_name}`
|
340
|
+
);
|
341
|
+
}
|
342
|
+
});
|
343
|
+
provided_keys.forEach((key) => {
|
344
|
+
if (!parameters.some((param) => param.parameter_name === key)) {
|
345
|
+
throw new Error(
|
346
|
+
`Parameter \`${key}\` is not a valid keyword argument. Please refer to the API for usage.`
|
347
|
+
);
|
348
|
+
}
|
349
|
+
});
|
350
|
+
resolved_data.forEach((value, idx) => {
|
351
|
+
if (value === void 0 && !parameters[idx].parameter_has_default) {
|
352
|
+
throw new Error(
|
353
|
+
`No value provided for required parameter: ${parameters[idx].parameter_name}`
|
354
|
+
);
|
355
|
+
}
|
356
|
+
});
|
357
|
+
return resolved_data;
|
358
|
+
};
|
320
359
|
async function view_api() {
|
321
360
|
if (this.api_info)
|
322
361
|
return this.api_info;
|
@@ -331,7 +370,7 @@ async function view_api() {
|
|
331
370
|
}
|
332
371
|
try {
|
333
372
|
let response;
|
334
|
-
if (semiver
|
373
|
+
if (semiver((config == null ? void 0 : config.version) || "2.0.0", "3.30") < 0) {
|
335
374
|
response = await this.fetch(SPACE_FETCHER_URL, {
|
336
375
|
method: "POST",
|
337
376
|
body: JSON.stringify({
|
@@ -638,7 +677,7 @@ async function predict(endpoint, data) {
|
|
638
677
|
);
|
639
678
|
}
|
640
679
|
return new Promise(async (resolve, reject) => {
|
641
|
-
const app = this.submit(endpoint, data
|
680
|
+
const app = this.submit(endpoint, data);
|
642
681
|
let result;
|
643
682
|
app.on("data", (d) => {
|
644
683
|
if (status_complete) {
|
@@ -885,7 +924,7 @@ function get_space_reference(url) {
|
|
885
924
|
return match[1];
|
886
925
|
}
|
887
926
|
}
|
888
|
-
function open_stream() {
|
927
|
+
async function open_stream() {
|
889
928
|
let {
|
890
929
|
event_callbacks,
|
891
930
|
unclosed_events,
|
@@ -906,7 +945,7 @@ function open_stream() {
|
|
906
945
|
if (jwt) {
|
907
946
|
url.searchParams.set("__sign", jwt);
|
908
947
|
}
|
909
|
-
stream = this.
|
948
|
+
stream = await this.stream(url);
|
910
949
|
if (!stream) {
|
911
950
|
console.warn("Cannot connect to SSE endpoint: " + url.toString());
|
912
951
|
return;
|
@@ -1074,6 +1113,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1074
1113
|
api_map,
|
1075
1114
|
config
|
1076
1115
|
);
|
1116
|
+
let resolved_data = map_data_to_params(data, api_info);
|
1077
1117
|
let websocket;
|
1078
1118
|
let stream;
|
1079
1119
|
let protocol = config.protocol ?? "ws";
|
@@ -1126,7 +1166,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1126
1166
|
);
|
1127
1167
|
}
|
1128
1168
|
}
|
1129
|
-
this.handle_blob(config.root,
|
1169
|
+
this.handle_blob(config.root, resolved_data, endpoint_info).then(
|
1130
1170
|
async (_payload) => {
|
1131
1171
|
var _a;
|
1132
1172
|
payload = {
|
@@ -1323,7 +1363,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1323
1363
|
if (this.jwt) {
|
1324
1364
|
url.searchParams.set("__sign", this.jwt);
|
1325
1365
|
}
|
1326
|
-
stream = this.
|
1366
|
+
stream = await this.stream(url);
|
1327
1367
|
if (!stream) {
|
1328
1368
|
return Promise.reject(
|
1329
1369
|
new Error("Cannot connect to SSE endpoint: " + url.toString())
|
@@ -1436,7 +1476,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1436
1476
|
headers
|
1437
1477
|
);
|
1438
1478
|
});
|
1439
|
-
post_data_promise.then(([response, status]) => {
|
1479
|
+
post_data_promise.then(async ([response, status]) => {
|
1440
1480
|
if (status === 503) {
|
1441
1481
|
fire_event({
|
1442
1482
|
type: "status",
|
@@ -1520,6 +1560,14 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1520
1560
|
endpoint: _endpoint,
|
1521
1561
|
fn_index
|
1522
1562
|
});
|
1563
|
+
if (data2.render_config) {
|
1564
|
+
fire_event({
|
1565
|
+
type: "render",
|
1566
|
+
data: data2.render_config,
|
1567
|
+
endpoint: _endpoint,
|
1568
|
+
fn_index
|
1569
|
+
});
|
1570
|
+
}
|
1523
1571
|
if (complete) {
|
1524
1572
|
fire_event({
|
1525
1573
|
type: "status",
|
@@ -1566,7 +1614,7 @@ function submit(endpoint, data, event_data, trigger_id) {
|
|
1566
1614
|
event_callbacks[event_id] = callback;
|
1567
1615
|
unclosed_events.add(event_id);
|
1568
1616
|
if (!stream_status.open) {
|
1569
|
-
this.open_stream();
|
1617
|
+
await this.open_stream();
|
1570
1618
|
}
|
1571
1619
|
}
|
1572
1620
|
});
|
@@ -1646,17 +1694,18 @@ class Client {
|
|
1646
1694
|
fetch(input, init) {
|
1647
1695
|
return fetch(input, init);
|
1648
1696
|
}
|
1649
|
-
|
1697
|
+
async stream(url) {
|
1650
1698
|
if (typeof window === "undefined" || typeof EventSource === "undefined") {
|
1651
|
-
|
1699
|
+
try {
|
1700
|
+
const EventSourceModule = await import("eventsource");
|
1652
1701
|
return new EventSourceModule.default(url.toString());
|
1653
|
-
}
|
1654
|
-
|
1655
|
-
|
1702
|
+
} catch (error) {
|
1703
|
+
console.error("Failed to load EventSource module:", error);
|
1704
|
+
throw error;
|
1705
|
+
}
|
1656
1706
|
} else {
|
1657
1707
|
return new EventSource(url.toString());
|
1658
1708
|
}
|
1659
|
-
return null;
|
1660
1709
|
}
|
1661
1710
|
async init() {
|
1662
1711
|
var _a;
|
@@ -1673,7 +1722,7 @@ class Client {
|
|
1673
1722
|
const heartbeat_url = new URL(
|
1674
1723
|
`${this.config.root}/heartbeat/${this.session_hash}`
|
1675
1724
|
);
|
1676
|
-
this.heartbeat_event = this.
|
1725
|
+
this.heartbeat_event = await this.stream(heartbeat_url);
|
1677
1726
|
if (this.config.space_id && this.options.hf_token) {
|
1678
1727
|
this.jwt = await get_jwt(
|
1679
1728
|
this.config.space_id,
|
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":"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"}
|
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;
|
@@ -144,7 +143,7 @@ export class Client {
|
|
144
143
|
const heartbeat_url = new URL(
|
145
144
|
`${this.config.root}/heartbeat/${this.session_hash}`
|
146
145
|
);
|
147
|
-
this.heartbeat_event = this.
|
146
|
+
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
|
148
147
|
|
149
148
|
if (this.config.space_id && this.options.hf_token) {
|
150
149
|
this.jwt = await get_jwt(
|
package/src/helpers/api_info.ts
CHANGED
@@ -298,3 +298,74 @@ export function handle_message(
|
|
298
298
|
|
299
299
|
return { type: "none", status: { stage: "error", queue } };
|
300
300
|
}
|
301
|
+
|
302
|
+
/**
|
303
|
+
* Maps the provided `data` to the parameters defined by the `/info` endpoint response.
|
304
|
+
* This allows us to support both positional and keyword arguments passed to the client
|
305
|
+
* and ensures that all parameters are either directly provided or have default values assigned.
|
306
|
+
*
|
307
|
+
* @param {unknown[] | Record<string, unknown>} data - The input data for the function,
|
308
|
+
* which can be either an array of values for positional arguments or an object
|
309
|
+
* with key-value pairs for keyword arguments.
|
310
|
+
* @param {JsApiData[]} parameters - Array of parameter descriptions retrieved from the
|
311
|
+
* `/info` endpoint.
|
312
|
+
*
|
313
|
+
* @returns {unknown[]} - Returns an array of resolved data where each element corresponds
|
314
|
+
* to the expected parameter from the API. The `parameter_default` value is used where
|
315
|
+
* a value is not provided for a parameter, and optional parameters without defaults are
|
316
|
+
* set to `undefined`.
|
317
|
+
*
|
318
|
+
* @throws {Error} - Throws an error:
|
319
|
+
* - If more arguments are provided than are defined in the parameters.
|
320
|
+
* * - If no parameter value is provided for a required parameter and no default value is defined.
|
321
|
+
* - If an argument is provided that does not match any defined parameter.
|
322
|
+
*/
|
323
|
+
|
324
|
+
export const map_data_to_params = (
|
325
|
+
data: unknown[] | Record<string, unknown>,
|
326
|
+
api_info: ApiInfo<JsApiData | ApiData>
|
327
|
+
): unknown[] => {
|
328
|
+
const parameters = Object.values(api_info.named_endpoints).flatMap(
|
329
|
+
(values) => values.parameters
|
330
|
+
);
|
331
|
+
|
332
|
+
if (Array.isArray(data)) {
|
333
|
+
if (data.length > parameters.length) {
|
334
|
+
console.warn("Too many arguments provided for the endpoint.");
|
335
|
+
}
|
336
|
+
return data;
|
337
|
+
}
|
338
|
+
|
339
|
+
const resolved_data: unknown[] = [];
|
340
|
+
const provided_keys = Object.keys(data);
|
341
|
+
|
342
|
+
parameters.forEach((param, index) => {
|
343
|
+
if (data.hasOwnProperty(param.parameter_name)) {
|
344
|
+
resolved_data[index] = data[param.parameter_name];
|
345
|
+
} else if (param.parameter_has_default) {
|
346
|
+
resolved_data[index] = param.parameter_default;
|
347
|
+
} else {
|
348
|
+
throw new Error(
|
349
|
+
`No value provided for required parameter: ${param.parameter_name}`
|
350
|
+
);
|
351
|
+
}
|
352
|
+
});
|
353
|
+
|
354
|
+
provided_keys.forEach((key) => {
|
355
|
+
if (!parameters.some((param) => param.parameter_name === key)) {
|
356
|
+
throw new Error(
|
357
|
+
`Parameter \`${key}\` is not a valid keyword argument. Please refer to the API for usage.`
|
358
|
+
);
|
359
|
+
}
|
360
|
+
});
|
361
|
+
|
362
|
+
resolved_data.forEach((value, idx) => {
|
363
|
+
if (value === undefined && !parameters[idx].parameter_has_default) {
|
364
|
+
throw new Error(
|
365
|
+
`No value provided for required parameter: ${parameters[idx].parameter_name}`
|
366
|
+
);
|
367
|
+
}
|
368
|
+
});
|
369
|
+
|
370
|
+
return resolved_data;
|
371
|
+
};
|
@@ -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
|
});
|