@gradio/client 0.8.2 → 0.9.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 CHANGED
@@ -1,5 +1,21 @@
1
1
  # @gradio/client
2
2
 
3
+ ## 0.9.1
4
+
5
+ ### Fixes
6
+
7
+ - [#6693](https://github.com/gradio-app/gradio/pull/6693) [`34f9431`](https://github.com/gradio-app/gradio/commit/34f943101bf7dd6b8a8974a6131c1ed7c4a0dac0) - Python client properly handles hearbeat and log messages. Also handles responses longer than 65k. Thanks [@freddyaboulton](https://github.com/freddyaboulton)!
8
+
9
+ ## 0.9.0
10
+
11
+ ### Features
12
+
13
+ - [#6398](https://github.com/gradio-app/gradio/pull/6398) [`67ddd40`](https://github.com/gradio-app/gradio/commit/67ddd40b4b70d3a37cb1637c33620f8d197dbee0) - Lite v4. Thanks [@whitphx](https://github.com/whitphx)!
14
+
15
+ ### Fixes
16
+
17
+ - [#6556](https://github.com/gradio-app/gradio/pull/6556) [`d76bcaa`](https://github.com/gradio-app/gradio/commit/d76bcaaaf0734aaf49a680f94ea9d4d22a602e70) - Fix api event drops. Thanks [@aliabid94](https://github.com/aliabid94)!
18
+
3
19
  ## 0.8.2
4
20
 
5
21
  ### Features
package/dist/client.d.ts CHANGED
@@ -34,7 +34,7 @@ interface Client {
34
34
  }) => Promise<client_return>;
35
35
  handle_blob: (endpoint: string, data: unknown[], api_info: ApiInfo<JsApiData>, token?: `hf_${string}`) => Promise<unknown[]>;
36
36
  }
37
- export declare function api_factory(fetch_implementation: typeof fetch, WebSocket_factory: (url: URL) => WebSocket): Client;
37
+ export declare function api_factory(fetch_implementation: typeof fetch, EventSource_factory: (url: URL) => EventSource): Client;
38
38
  export declare const post_data: (url: string, body: unknown, token?: `hf_${string}`) => Promise<[PostResponse, number]>, upload_files: (root: string, files: File[], token?: `hf_${string}`, upload_id?: string) => Promise<UploadResponse>, client: (app_reference: string, options: {
39
39
  hf_token?: `hf_${string}`;
40
40
  status_callback?: SpaceStatusCallback;
@@ -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
@@ -326,7 +326,7 @@ async function duplicate(app_reference, options) {
326
326
  throw new Error(e);
327
327
  }
328
328
  }
329
- function api_factory(fetch_implementation, WebSocket_factory) {
329
+ function api_factory(fetch_implementation, EventSource_factory) {
330
330
  return { post_data: post_data2, upload_files: upload_files2, client: client2, handle_blob: handle_blob2 };
331
331
  async function post_data2(url, body, token) {
332
332
  const headers = { "Content-Type": "application/json" };
@@ -342,8 +342,16 @@ function api_factory(fetch_implementation, WebSocket_factory) {
342
342
  } catch (e) {
343
343
  return [{ error: BROKEN_CONNECTION_MSG }, 500];
344
344
  }
345
- const output = await response.json();
346
- return [output, response.status];
345
+ let output;
346
+ let status;
347
+ try {
348
+ output = await response.json();
349
+ status = response.status;
350
+ } catch (e) {
351
+ output = { error: `Could not parse server response: ${e}` };
352
+ status = 500;
353
+ }
354
+ return [output, status];
347
355
  }
348
356
  async function upload_files2(root, files, token, upload_id) {
349
357
  const headers = {};
@@ -391,6 +399,9 @@ function api_factory(fetch_implementation, WebSocket_factory) {
391
399
  const { ws_protocol, http_protocol, host, space_id } = await process_endpoint(app_reference, hf_token);
392
400
  const session_hash = Math.random().toString(36).substring(2);
393
401
  const last_status = {};
402
+ let stream_open = false;
403
+ let event_stream = null;
404
+ const event_callbacks = {};
394
405
  let config;
395
406
  let api_map = {};
396
407
  let jwt = false;
@@ -523,7 +534,7 @@ function api_factory(fetch_implementation, WebSocket_factory) {
523
534
  }
524
535
  let websocket;
525
536
  let eventSource;
526
- let protocol = config.protocol ?? "sse";
537
+ let protocol = config.protocol ?? "ws";
527
538
  const _endpoint = typeof endpoint === "number" ? "/predict" : endpoint;
528
539
  let payload;
529
540
  let event_id = null;
@@ -620,7 +631,7 @@ function api_factory(fetch_implementation, WebSocket_factory) {
620
631
  if (jwt) {
621
632
  url.searchParams.set("__sign", jwt);
622
633
  }
623
- websocket = WebSocket_factory(url);
634
+ websocket = new WebSocket(url);
624
635
  websocket.onclose = (evt) => {
625
636
  if (!evt.wasClean) {
626
637
  fire_event({
@@ -711,7 +722,7 @@ function api_factory(fetch_implementation, WebSocket_factory) {
711
722
  () => websocket.send(JSON.stringify({ hash: session_hash }))
712
723
  );
713
724
  }
714
- } else {
725
+ } else if (protocol == "sse") {
715
726
  fire_event({
716
727
  type: "status",
717
728
  stage: "pending",
@@ -731,7 +742,7 @@ function api_factory(fetch_implementation, WebSocket_factory) {
731
742
  true
732
743
  )}/queue/join?${url_params ? url_params + "&" : ""}${params}`
733
744
  );
734
- eventSource = new EventSource(url);
745
+ eventSource = EventSource_factory(url);
735
746
  eventSource.onmessage = async function(event) {
736
747
  const _data = JSON.parse(event.data);
737
748
  const { type, status, data: data2 } = handle_message(
@@ -824,6 +835,123 @@ function api_factory(fetch_implementation, WebSocket_factory) {
824
835
  }
825
836
  }
826
837
  };
838
+ } else if (protocol == "sse_v1") {
839
+ fire_event({
840
+ type: "status",
841
+ stage: "pending",
842
+ queue: true,
843
+ endpoint: _endpoint,
844
+ fn_index,
845
+ time: /* @__PURE__ */ new Date()
846
+ });
847
+ post_data2(
848
+ `${http_protocol}//${resolve_root(
849
+ host,
850
+ config.path,
851
+ true
852
+ )}/queue/join?${url_params}`,
853
+ {
854
+ ...payload,
855
+ session_hash
856
+ },
857
+ hf_token
858
+ ).then(([response, status]) => {
859
+ if (status === 503) {
860
+ fire_event({
861
+ type: "status",
862
+ stage: "error",
863
+ message: QUEUE_FULL_MSG,
864
+ queue: true,
865
+ endpoint: _endpoint,
866
+ fn_index,
867
+ time: /* @__PURE__ */ new Date()
868
+ });
869
+ } else if (status !== 200) {
870
+ fire_event({
871
+ type: "status",
872
+ stage: "error",
873
+ message: BROKEN_CONNECTION_MSG,
874
+ queue: true,
875
+ endpoint: _endpoint,
876
+ fn_index,
877
+ time: /* @__PURE__ */ new Date()
878
+ });
879
+ } else {
880
+ event_id = response.event_id;
881
+ if (!stream_open) {
882
+ open_stream();
883
+ }
884
+ let callback = async function(_data) {
885
+ const { type, status: status2, data: data2 } = handle_message(
886
+ _data,
887
+ last_status[fn_index]
888
+ );
889
+ if (type === "update" && status2 && !complete) {
890
+ fire_event({
891
+ type: "status",
892
+ endpoint: _endpoint,
893
+ fn_index,
894
+ time: /* @__PURE__ */ new Date(),
895
+ ...status2
896
+ });
897
+ } else if (type === "complete") {
898
+ complete = status2;
899
+ } else if (type === "log") {
900
+ fire_event({
901
+ type: "log",
902
+ log: data2.log,
903
+ level: data2.level,
904
+ endpoint: _endpoint,
905
+ fn_index
906
+ });
907
+ } else if (type === "generating") {
908
+ fire_event({
909
+ type: "status",
910
+ time: /* @__PURE__ */ new Date(),
911
+ ...status2,
912
+ stage: status2 == null ? void 0 : status2.stage,
913
+ queue: true,
914
+ endpoint: _endpoint,
915
+ fn_index
916
+ });
917
+ }
918
+ if (data2) {
919
+ fire_event({
920
+ type: "data",
921
+ time: /* @__PURE__ */ new Date(),
922
+ data: transform_files ? transform_output(
923
+ data2.data,
924
+ api_info,
925
+ config.root,
926
+ config.root_url
927
+ ) : data2.data,
928
+ endpoint: _endpoint,
929
+ fn_index
930
+ });
931
+ if (complete) {
932
+ fire_event({
933
+ type: "status",
934
+ time: /* @__PURE__ */ new Date(),
935
+ ...complete,
936
+ stage: status2 == null ? void 0 : status2.stage,
937
+ queue: true,
938
+ endpoint: _endpoint,
939
+ fn_index
940
+ });
941
+ }
942
+ }
943
+ if (status2.stage === "complete" || status2.stage === "error") {
944
+ if (event_callbacks[event_id]) {
945
+ delete event_callbacks[event_id];
946
+ if (Object.keys(event_callbacks).length === 0) {
947
+ close_stream();
948
+ }
949
+ }
950
+ }
951
+ };
952
+ event_callbacks[event_id] = callback;
953
+ }
954
+ });
827
955
  }
828
956
  });
829
957
  function fire_event(event) {
@@ -905,6 +1033,28 @@ function api_factory(fetch_implementation, WebSocket_factory) {
905
1033
  destroy
906
1034
  };
907
1035
  }
1036
+ function open_stream() {
1037
+ stream_open = true;
1038
+ let params = new URLSearchParams({
1039
+ session_hash
1040
+ }).toString();
1041
+ let url = new URL(
1042
+ `${http_protocol}//${resolve_root(
1043
+ host,
1044
+ config.path,
1045
+ true
1046
+ )}/queue/data?${params}`
1047
+ );
1048
+ event_stream = new EventSource(url);
1049
+ event_stream.onmessage = async function(event) {
1050
+ let _data = JSON.parse(event.data);
1051
+ await event_callbacks[_data.event_id](_data);
1052
+ };
1053
+ }
1054
+ function close_stream() {
1055
+ stream_open = false;
1056
+ event_stream == null ? void 0 : event_stream.close();
1057
+ }
908
1058
  async function component_server(component_id, fn_name, data) {
909
1059
  var _a;
910
1060
  const headers = { "Content-Type": "application/json" };
@@ -1016,7 +1166,7 @@ function api_factory(fetch_implementation, WebSocket_factory) {
1016
1166
  }
1017
1167
  const { post_data, upload_files, client, handle_blob } = api_factory(
1018
1168
  fetch,
1019
- (...args) => new WebSocket(...args)
1169
+ (...args) => new EventSource(...args)
1020
1170
  );
1021
1171
  function transform_output(data, api_info, root_url, remote_url) {
1022
1172
  return data.map((d, i) => {
package/dist/types.d.ts CHANGED
@@ -20,7 +20,7 @@ export interface Config {
20
20
  show_api: boolean;
21
21
  stylesheets: string[];
22
22
  path: string;
23
- protocol?: "sse" | "ws";
23
+ protocol?: "sse_v1" | "sse" | "ws";
24
24
  }
25
25
  export interface Payload {
26
26
  data: unknown[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gradio/client",
3
- "version": "0.8.2",
3
+ "version": "0.9.1",
4
4
  "description": "Gradio API client",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/src/client.ts CHANGED
@@ -178,7 +178,7 @@ interface Client {
178
178
 
179
179
  export function api_factory(
180
180
  fetch_implementation: typeof fetch,
181
- WebSocket_factory: (url: URL) => WebSocket
181
+ EventSource_factory: (url: URL) => EventSource
182
182
  ): Client {
183
183
  return { post_data, upload_files, client, handle_blob };
184
184
 
@@ -203,8 +203,16 @@ export function api_factory(
203
203
  } catch (e) {
204
204
  return [{ error: BROKEN_CONNECTION_MSG }, 500];
205
205
  }
206
- const output: PostResponse = await response.json();
207
- return [output, response.status];
206
+ let output: PostResponse;
207
+ let status: int;
208
+ try {
209
+ output = await response.json();
210
+ status = response.status;
211
+ } catch (e) {
212
+ output = { error: `Could not parse server response: ${e}` };
213
+ status = 500;
214
+ }
215
+ return [output, status];
208
216
  }
209
217
 
210
218
  async function upload_files(
@@ -278,6 +286,9 @@ export function api_factory(
278
286
 
279
287
  const session_hash = Math.random().toString(36).substring(2);
280
288
  const last_status: Record<string, Status["stage"]> = {};
289
+ let stream_open = false;
290
+ let event_stream: EventSource | null = null;
291
+ const event_callbacks: Record<string, () => Promise<void>> = {};
281
292
  let config: Config;
282
293
  let api_map: Record<string, number> = {};
283
294
 
@@ -437,7 +448,7 @@ export function api_factory(
437
448
 
438
449
  let websocket: WebSocket;
439
450
  let eventSource: EventSource;
440
- let protocol = config.protocol ?? "sse";
451
+ let protocol = config.protocol ?? "ws";
441
452
 
442
453
  const _endpoint = typeof endpoint === "number" ? "/predict" : endpoint;
443
454
  let payload: Payload;
@@ -546,7 +557,7 @@ export function api_factory(
546
557
  url.searchParams.set("__sign", jwt);
547
558
  }
548
559
 
549
- websocket = WebSocket_factory(url);
560
+ websocket = new WebSocket(url);
550
561
 
551
562
  websocket.onclose = (evt) => {
552
563
  if (!evt.wasClean) {
@@ -646,7 +657,7 @@ export function api_factory(
646
657
  websocket.send(JSON.stringify({ hash: session_hash }))
647
658
  );
648
659
  }
649
- } else {
660
+ } else if (protocol == "sse") {
650
661
  fire_event({
651
662
  type: "status",
652
663
  stage: "pending",
@@ -667,7 +678,7 @@ export function api_factory(
667
678
  )}/queue/join?${url_params ? url_params + "&" : ""}${params}`
668
679
  );
669
680
 
670
- eventSource = new EventSource(url);
681
+ eventSource = EventSource_factory(url);
671
682
 
672
683
  eventSource.onmessage = async function (event) {
673
684
  const _data = JSON.parse(event.data);
@@ -766,6 +777,130 @@ export function api_factory(
766
777
  }
767
778
  }
768
779
  };
780
+ } else if (protocol == "sse_v1") {
781
+ fire_event({
782
+ type: "status",
783
+ stage: "pending",
784
+ queue: true,
785
+ endpoint: _endpoint,
786
+ fn_index,
787
+ time: new Date()
788
+ });
789
+
790
+ post_data(
791
+ `${http_protocol}//${resolve_root(
792
+ host,
793
+ config.path,
794
+ true
795
+ )}/queue/join?${url_params}`,
796
+ {
797
+ ...payload,
798
+ session_hash
799
+ },
800
+ hf_token
801
+ ).then(([response, status]) => {
802
+ if (status === 503) {
803
+ fire_event({
804
+ type: "status",
805
+ stage: "error",
806
+ message: QUEUE_FULL_MSG,
807
+ queue: true,
808
+ endpoint: _endpoint,
809
+ fn_index,
810
+ time: new Date()
811
+ });
812
+ } else if (status !== 200) {
813
+ fire_event({
814
+ type: "status",
815
+ stage: "error",
816
+ message: BROKEN_CONNECTION_MSG,
817
+ queue: true,
818
+ endpoint: _endpoint,
819
+ fn_index,
820
+ time: new Date()
821
+ });
822
+ } else {
823
+ event_id = response.event_id as string;
824
+ if (!stream_open) {
825
+ open_stream();
826
+ }
827
+ let callback = async function (_data: object): void {
828
+ const { type, status, data } = handle_message(
829
+ _data,
830
+ last_status[fn_index]
831
+ );
832
+
833
+ if (type === "update" && status && !complete) {
834
+ // call 'status' listeners
835
+ fire_event({
836
+ type: "status",
837
+ endpoint: _endpoint,
838
+ fn_index,
839
+ time: new Date(),
840
+ ...status
841
+ });
842
+ } else if (type === "complete") {
843
+ complete = status;
844
+ } else if (type === "log") {
845
+ fire_event({
846
+ type: "log",
847
+ log: data.log,
848
+ level: data.level,
849
+ endpoint: _endpoint,
850
+ fn_index
851
+ });
852
+ } else if (type === "generating") {
853
+ fire_event({
854
+ type: "status",
855
+ time: new Date(),
856
+ ...status,
857
+ stage: status?.stage!,
858
+ queue: true,
859
+ endpoint: _endpoint,
860
+ fn_index
861
+ });
862
+ }
863
+ if (data) {
864
+ fire_event({
865
+ type: "data",
866
+ time: new Date(),
867
+ data: transform_files
868
+ ? transform_output(
869
+ data.data,
870
+ api_info,
871
+ config.root,
872
+ config.root_url
873
+ )
874
+ : data.data,
875
+ endpoint: _endpoint,
876
+ fn_index
877
+ });
878
+
879
+ if (complete) {
880
+ fire_event({
881
+ type: "status",
882
+ time: new Date(),
883
+ ...complete,
884
+ stage: status?.stage!,
885
+ queue: true,
886
+ endpoint: _endpoint,
887
+ fn_index
888
+ });
889
+ }
890
+ }
891
+
892
+ if (status.stage === "complete" || status.stage === "error") {
893
+ if (event_callbacks[event_id]) {
894
+ delete event_callbacks[event_id];
895
+ if (Object.keys(event_callbacks).length === 0) {
896
+ close_stream();
897
+ }
898
+ }
899
+ }
900
+ };
901
+ event_callbacks[event_id] = callback;
902
+ }
903
+ });
769
904
  }
770
905
  });
771
906
 
@@ -864,6 +999,30 @@ export function api_factory(
864
999
  };
865
1000
  }
866
1001
 
1002
+ function open_stream(): void {
1003
+ stream_open = true;
1004
+ let params = new URLSearchParams({
1005
+ session_hash: session_hash
1006
+ }).toString();
1007
+ let url = new URL(
1008
+ `${http_protocol}//${resolve_root(
1009
+ host,
1010
+ config.path,
1011
+ true
1012
+ )}/queue/data?${params}`
1013
+ );
1014
+ event_stream = new EventSource(url);
1015
+ event_stream.onmessage = async function (event) {
1016
+ let _data = JSON.parse(event.data);
1017
+ await event_callbacks[_data.event_id](_data);
1018
+ };
1019
+ }
1020
+
1021
+ function close_stream(): void {
1022
+ stream_open = false;
1023
+ event_stream?.close();
1024
+ }
1025
+
867
1026
  async function component_server(
868
1027
  component_id: number,
869
1028
  fn_name: string,
@@ -1007,7 +1166,7 @@ export function api_factory(
1007
1166
 
1008
1167
  export const { post_data, upload_files, client, handle_blob } = api_factory(
1009
1168
  fetch,
1010
- (...args) => new WebSocket(...args)
1169
+ (...args) => new EventSource(...args)
1011
1170
  );
1012
1171
 
1013
1172
  function transform_output(
package/src/types.ts CHANGED
@@ -20,7 +20,7 @@ export interface Config {
20
20
  show_api: boolean;
21
21
  stylesheets: string[];
22
22
  path: string;
23
- protocol?: "sse" | "ws";
23
+ protocol?: "sse_v1" | "sse" | "ws";
24
24
  }
25
25
 
26
26
  export interface Payload {