@gradio/client 0.4.2 → 0.5.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 CHANGED
@@ -1,5 +1,31 @@
1
1
  # @gradio/client
2
2
 
3
+ ## 0.5.0
4
+
5
+ ### Highlights
6
+
7
+ #### new `FileExplorer` component ([#5672](https://github.com/gradio-app/gradio/pull/5672) [`e4a307ed6`](https://github.com/gradio-app/gradio/commit/e4a307ed6cde3bbdf4ff2f17655739addeec941e))
8
+
9
+ Thanks to a new capability that allows components to communicate directly with the server _without_ passing data via the value, we have created a new `FileExplorer` component.
10
+
11
+ This component allows you to populate the explorer by passing a glob, but only provides the selected file(s) in your prediction function.
12
+
13
+ Users can then navigate the virtual filesystem and select files which will be accessible in your predict function. This component will allow developers to build more complex spaces, with more flexible input options.
14
+
15
+ ![output](https://github.com/pngwn/MDsveX/assets/12937446/ef108f0b-0e84-4292-9984-9dc66b3e144d)
16
+
17
+ For more information check the [`FileExplorer` documentation](https://gradio.app/docs/fileexplorer).
18
+
19
+ Thanks [@aliabid94](https://github.com/aliabid94)!
20
+
21
+ ### Features
22
+
23
+ - [#5787](https://github.com/gradio-app/gradio/pull/5787) [`caeee8bf7`](https://github.com/gradio-app/gradio/commit/caeee8bf7821fd5fe2f936ed82483bed00f613ec) - ensure the client does not depend on `window` when running in a node environment. Thanks [@gibiee](https://github.com/gibiee)!
24
+
25
+ ### Fixes
26
+
27
+ - [#5776](https://github.com/gradio-app/gradio/pull/5776) [`c0fef4454`](https://github.com/gradio-app/gradio/commit/c0fef44541bfa61568bdcfcdfc7d7d79869ab1df) - Revert replica proxy logic and instead implement using the `root` variable. Thanks [@freddyaboulton](https://github.com/freddyaboulton)!
28
+
3
29
  ## 0.4.2
4
30
 
5
31
  ### Features
package/dist/client.d.ts CHANGED
@@ -7,6 +7,7 @@ type client_return = {
7
7
  predict: predict;
8
8
  config: Config;
9
9
  submit: (endpoint: string | number, data?: unknown[], event_data?: unknown) => SubmitReturn;
10
+ component_server: (component_id: number, fn_name: string, data: unknown[]) => any;
10
11
  view_api: (c?: Config) => Promise<ApiInfo<JsApiData>>;
11
12
  };
12
13
  type SubmitReturn = {
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,6 +4,12 @@ function semiver(a, b, bool) {
4
4
  b = b.split(".");
5
5
  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);
6
6
  }
7
+ function resolve_root(base_url, root_path, prioritize_base) {
8
+ if (root_path.startsWith("http://") || root_path.startsWith("https://")) {
9
+ return prioritize_base ? base_url : root_path;
10
+ }
11
+ return base_url + root_path;
12
+ }
7
13
  function determine_protocol(endpoint) {
8
14
  if (endpoint.startsWith("http")) {
9
15
  const { protocol, host } = new URL(endpoint);
@@ -261,7 +267,8 @@ function api_factory(fetch_implementation, WebSocket_factory) {
261
267
  const return_obj = {
262
268
  predict,
263
269
  submit,
264
- view_api
270
+ view_api,
271
+ component_server
265
272
  // duplicate
266
273
  };
267
274
  const transform_files = normalise_files ?? true;
@@ -408,11 +415,14 @@ function api_factory(fetch_implementation, WebSocket_factory) {
408
415
  let payload;
409
416
  let complete = false;
410
417
  const listener_map = {};
411
- const url_params = new URLSearchParams(
412
- window.location.search
413
- ).toString();
418
+ let url_params = "";
419
+ if (typeof window !== "undefined") {
420
+ url_params = new URLSearchParams(
421
+ window.location.search
422
+ ).toString();
423
+ }
414
424
  handle_blob2(
415
- `${http_protocol}//${host + config.path}`,
425
+ `${http_protocol}//${resolve_root(host, config.path, true)}`,
416
426
  data,
417
427
  api_info,
418
428
  hf_token
@@ -428,7 +438,7 @@ function api_factory(fetch_implementation, WebSocket_factory) {
428
438
  time: /* @__PURE__ */ new Date()
429
439
  });
430
440
  post_data2(
431
- `${http_protocol}//${host + config.path}/run${_endpoint.startsWith("/") ? _endpoint : `/${_endpoint}`}${url_params ? "?" + url_params : ""}`,
441
+ `${http_protocol}//${resolve_root(host, config.path, true)}/run${_endpoint.startsWith("/") ? _endpoint : `/${_endpoint}`}${url_params ? "?" + url_params : ""}`,
432
442
  {
433
443
  ...payload,
434
444
  session_hash
@@ -489,7 +499,11 @@ function api_factory(fetch_implementation, WebSocket_factory) {
489
499
  fn_index,
490
500
  time: /* @__PURE__ */ new Date()
491
501
  });
492
- let url = new URL(`${ws_protocol}://${host}${config.path}
502
+ let url = new URL(`${ws_protocol}://${resolve_root(
503
+ host,
504
+ config.path,
505
+ true
506
+ )}
493
507
  /queue/join${url_params ? "?" + url_params : ""}`);
494
508
  if (jwt) {
495
509
  url.searchParams.set("__sign", jwt);
@@ -628,7 +642,11 @@ function api_factory(fetch_implementation, WebSocket_factory) {
628
642
  }
629
643
  try {
630
644
  await fetch_implementation(
631
- `${http_protocol}//${host + config.path}/reset`,
645
+ `${http_protocol}//${resolve_root(
646
+ host,
647
+ config.path,
648
+ true
649
+ )}/reset`,
632
650
  {
633
651
  headers: { "Content-Type": "application/json" },
634
652
  method: "POST",
@@ -655,6 +673,42 @@ function api_factory(fetch_implementation, WebSocket_factory) {
655
673
  destroy
656
674
  };
657
675
  }
676
+ async function component_server(component_id, fn_name, data) {
677
+ var _a;
678
+ const headers = { "Content-Type": "application/json" };
679
+ if (hf_token) {
680
+ headers.Authorization = `Bearer ${hf_token}`;
681
+ }
682
+ let root_url;
683
+ let component = config.components.find(
684
+ (comp) => comp.id === component_id
685
+ );
686
+ if ((_a = component == null ? void 0 : component.props) == null ? void 0 : _a.root_url) {
687
+ root_url = component.props.root_url;
688
+ } else {
689
+ root_url = `${http_protocol}//${host + config.path}/`;
690
+ }
691
+ const response = await fetch_implementation(
692
+ `${root_url}component_server/`,
693
+ {
694
+ method: "POST",
695
+ body: JSON.stringify({
696
+ data,
697
+ component_id,
698
+ fn_name,
699
+ session_hash
700
+ }),
701
+ headers
702
+ }
703
+ );
704
+ if (!response.ok) {
705
+ throw new Error(
706
+ "Could not connect to component server: " + response.statusText
707
+ );
708
+ }
709
+ const output = await response.json();
710
+ return output;
711
+ }
658
712
  async function view_api(config2) {
659
713
  if (api)
660
714
  return api;
@@ -946,7 +1000,7 @@ async function resolve_config(fetch_implementation, endpoint, token) {
946
1000
  if (typeof window !== "undefined" && window.gradio_config && location.origin !== "http://localhost:9876" && !window.gradio_config.dev_mode) {
947
1001
  const path = window.gradio_config.root;
948
1002
  const config = window.gradio_config;
949
- config.root = endpoint + config.root;
1003
+ config.root = resolve_root(endpoint, config.root, false);
950
1004
  return { ...config, path };
951
1005
  } else if (endpoint) {
952
1006
  let response = await fetch_implementation(`${endpoint}/config`, {
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,15 @@
1
1
  import type { Config } from "./types.js";
2
+ /**
3
+ * This function is used to resolve the URL for making requests when the app has a root path.
4
+ * The root path could be a path suffix like "/app" which is appended to the end of the base URL. Or
5
+ * it could be a full URL like "https://abidlabs-test-client-replica--gqf2x.hf.space" which is used when hosting
6
+ * Gradio apps on Hugging Face Spaces.
7
+ * @param {string} base_url The base URL at which the Gradio server is hosted
8
+ * @param {string} root_path The root path, which could be a path suffix (e.g. mounted in FastAPI app) or a full URL (e.g. hosted on Hugging Face Spaces)
9
+ * @param {boolean} prioritize_base Whether to prioritize the base URL over the root path. This is used when both the base path and root paths are full URLs. For example, for fetching files the root path should be prioritized, but for making request, the base URL should be prioritized.
10
+ * @returns {string} the resolved URL
11
+ */
12
+ export declare function resolve_root(base_url: string, root_path: string, prioritize_base: boolean): string;
2
13
  export declare function determine_protocol(endpoint: string): {
3
14
  ws_protocol: "ws" | "wss";
4
15
  http_protocol: "http:" | "https:";
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACrD,WAAW,EAAE,IAAI,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACb,CAwBA;AAED,eAAO,MAAM,aAAa,QAAqB,CAAC;AAChD,eAAO,MAAM,eAAe,QAAwB,CAAC;AACrD,wBAAsB,gBAAgB,CACrC,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,MAAM,EAAE,GACpB,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,gBAAgB,CAC/B,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,GACzB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxB;AAID,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAe5E;AAED,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAqB1C;AAED,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,EAC7C,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAuB1C;AAED,wBAAsB,iBAAiB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED,eAAO,MAAM,cAAc,0GAQjB,CAAC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEzC;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,OAAO,GACtB,MAAM,CAKR;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACrD,WAAW,EAAE,IAAI,GAAG,KAAK,CAAC;IAC1B,aAAa,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACb,CAwBA;AAED,eAAO,MAAM,aAAa,QAAqB,CAAC;AAChD,eAAO,MAAM,eAAe,QAAwB,CAAC;AACrD,wBAAsB,gBAAgB,CACrC,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,MAAM,EAAE,GACpB,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,gBAAgB,CAC/B,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,GACzB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAQxB;AAID,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAe5E;AAED,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAqB1C;AAED,wBAAsB,kBAAkB,CACvC,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,EAC7C,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,CAuB1C;AAED,wBAAsB,iBAAiB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,MAAM,EAAE,GACnB,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED,eAAO,MAAM,cAAc,0GAQjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gradio/client",
3
- "version": "0.4.2",
3
+ "version": "0.5.0",
4
4
  "description": "Gradio API client",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/client.ts CHANGED
@@ -8,7 +8,8 @@ import {
8
8
  get_space_hardware,
9
9
  set_space_hardware,
10
10
  set_space_timeout,
11
- hardware_types
11
+ hardware_types,
12
+ resolve_root
12
13
  } from "./utils.js";
13
14
 
14
15
  import type {
@@ -45,6 +46,11 @@ type client_return = {
45
46
  data?: unknown[],
46
47
  event_data?: unknown
47
48
  ) => SubmitReturn;
49
+ component_server: (
50
+ component_id: number,
51
+ fn_name: string,
52
+ data: unknown[]
53
+ ) => any;
48
54
  view_api: (c?: Config) => Promise<ApiInfo<JsApiData>>;
49
55
  };
50
56
 
@@ -243,7 +249,8 @@ export function api_factory(
243
249
  const return_obj = {
244
250
  predict,
245
251
  submit,
246
- view_api
252
+ view_api,
253
+ component_server
247
254
  // duplicate
248
255
  };
249
256
 
@@ -422,12 +429,15 @@ export function api_factory(
422
429
  let payload: Payload;
423
430
  let complete: false | Record<string, any> = false;
424
431
  const listener_map: ListenerMap<EventType> = {};
425
- const url_params = new URLSearchParams(
426
- window.location.search
427
- ).toString();
432
+ let url_params = ""
433
+ if (typeof(window) !== "undefined") {
434
+ url_params = new URLSearchParams(
435
+ window.location.search
436
+ ).toString();
437
+ }
428
438
 
429
439
  handle_blob(
430
- `${http_protocol}//${host + config.path}`,
440
+ `${http_protocol}//${resolve_root(host, config.path, true)}`,
431
441
  data,
432
442
  api_info,
433
443
  hf_token
@@ -444,7 +454,7 @@ export function api_factory(
444
454
  });
445
455
 
446
456
  post_data(
447
- `${http_protocol}//${host + config.path}/run${
457
+ `${http_protocol}//${resolve_root(host, config.path, true)}/run${
448
458
  _endpoint.startsWith("/") ? _endpoint : `/${_endpoint}`
449
459
  }${url_params ? "?" + url_params : ""}`,
450
460
  {
@@ -512,8 +522,11 @@ export function api_factory(
512
522
  fn_index,
513
523
  time: new Date()
514
524
  });
515
-
516
- let url = new URL(`${ws_protocol}://${host}${config.path}
525
+ let url = new URL(`${ws_protocol}://${resolve_root(
526
+ host,
527
+ config.path,
528
+ true
529
+ )}
517
530
  /queue/join${url_params ? "?" + url_params : ""}`);
518
531
 
519
532
  if (jwt) {
@@ -677,7 +690,11 @@ export function api_factory(
677
690
 
678
691
  try {
679
692
  await fetch_implementation(
680
- `${http_protocol}//${host + config.path}/reset`,
693
+ `${http_protocol}//${resolve_root(
694
+ host,
695
+ config.path,
696
+ true
697
+ )}/reset`,
681
698
  {
682
699
  headers: { "Content-Type": "application/json" },
683
700
  method: "POST",
@@ -707,6 +724,51 @@ export function api_factory(
707
724
  };
708
725
  }
709
726
 
727
+ async function component_server(
728
+ component_id: number,
729
+ fn_name: string,
730
+ data: unknown[]
731
+ ): Promise<any> {
732
+ const headers: {
733
+ Authorization?: string;
734
+ "Content-Type": "application/json";
735
+ } = { "Content-Type": "application/json" };
736
+ if (hf_token) {
737
+ headers.Authorization = `Bearer ${hf_token}`;
738
+ }
739
+ let root_url: string;
740
+ let component = config.components.find(
741
+ (comp) => comp.id === component_id
742
+ );
743
+ if (component?.props?.root_url) {
744
+ root_url = component.props.root_url;
745
+ } else {
746
+ root_url = `${http_protocol}//${host + config.path}/`;
747
+ }
748
+ const response = await fetch_implementation(
749
+ `${root_url}component_server/`,
750
+ {
751
+ method: "POST",
752
+ body: JSON.stringify({
753
+ data: data,
754
+ component_id: component_id,
755
+ fn_name: fn_name,
756
+ session_hash: session_hash
757
+ }),
758
+ headers
759
+ }
760
+ );
761
+
762
+ if (!response.ok) {
763
+ throw new Error(
764
+ "Could not connect to component server: " + response.statusText
765
+ );
766
+ }
767
+
768
+ const output = await response.json();
769
+ return output;
770
+ }
771
+
710
772
  async function view_api(config?: Config): Promise<ApiInfo<JsApiData>> {
711
773
  if (api) return api;
712
774
 
@@ -1152,7 +1214,7 @@ async function resolve_config(
1152
1214
  ) {
1153
1215
  const path = window.gradio_config.root;
1154
1216
  const config = window.gradio_config;
1155
- config.root = endpoint + config.root;
1217
+ config.root = resolve_root(endpoint, config.root, false);
1156
1218
  return { ...config, path: path };
1157
1219
  } else if (endpoint) {
1158
1220
  let response = await fetch_implementation(`${endpoint}/config`, {
package/src/utils.ts CHANGED
@@ -1,5 +1,26 @@
1
1
  import type { Config } from "./types.js";
2
2
 
3
+ /**
4
+ * This function is used to resolve the URL for making requests when the app has a root path.
5
+ * The root path could be a path suffix like "/app" which is appended to the end of the base URL. Or
6
+ * it could be a full URL like "https://abidlabs-test-client-replica--gqf2x.hf.space" which is used when hosting
7
+ * Gradio apps on Hugging Face Spaces.
8
+ * @param {string} base_url The base URL at which the Gradio server is hosted
9
+ * @param {string} root_path The root path, which could be a path suffix (e.g. mounted in FastAPI app) or a full URL (e.g. hosted on Hugging Face Spaces)
10
+ * @param {boolean} prioritize_base Whether to prioritize the base URL over the root path. This is used when both the base path and root paths are full URLs. For example, for fetching files the root path should be prioritized, but for making request, the base URL should be prioritized.
11
+ * @returns {string} the resolved URL
12
+ */
13
+ export function resolve_root(
14
+ base_url: string,
15
+ root_path: string,
16
+ prioritize_base: boolean
17
+ ): string {
18
+ if (root_path.startsWith("http://") || root_path.startsWith("https://")) {
19
+ return prioritize_base ? base_url : root_path;
20
+ }
21
+ return base_url + root_path;
22
+ }
23
+
3
24
  export function determine_protocol(endpoint: string): {
4
25
  ws_protocol: "ws" | "wss";
5
26
  http_protocol: "http:" | "https:";