@gradio/core 0.23.2 → 0.24.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/package.json CHANGED
@@ -1,68 +1,68 @@
1
1
  {
2
2
  "name": "@gradio/core",
3
- "version": "0.23.2",
3
+ "version": "0.24.0",
4
4
  "type": "module",
5
5
  "devDependencies": {
6
- "@gradio/atoms": "^0.16.3",
7
6
  "@gradio/accordion": "^0.5.20",
8
- "@gradio/annotatedimage": "^0.9.25",
9
- "@gradio/audio": "^0.17.21",
10
- "@gradio/box": "^0.2.21",
11
- "@gradio/button": "^0.5.7",
7
+ "@gradio/annotatedimage": "^0.9.26",
8
+ "@gradio/atoms": "^0.16.3",
9
+ "@gradio/audio": "^0.17.22",
12
10
  "@gradio/browserstate": "^0.3.2",
13
- "@gradio/chatbot": "^0.26.18",
11
+ "@gradio/box": "^0.2.21",
12
+ "@gradio/button": "^0.5.8",
14
13
  "@gradio/checkbox": "^0.4.26",
15
14
  "@gradio/checkboxgroup": "^0.6.25",
16
- "@gradio/client": "^1.15.6",
17
- "@gradio/code": "^0.14.11",
18
- "@gradio/dataset": "^0.4.28",
19
- "@gradio/dataframe": "^0.18.3",
20
- "@gradio/datetime": "^0.3.18",
15
+ "@gradio/chatbot": "^0.26.19",
16
+ "@gradio/client": "^1.15.7",
17
+ "@gradio/code": "^0.14.12",
21
18
  "@gradio/colorpicker": "^0.4.25",
22
- "@gradio/downloadbutton": "^0.4.7",
23
- "@gradio/dropdown": "^0.9.25",
24
19
  "@gradio/column": "^0.2.1",
25
- "@gradio/file": "^0.12.24",
20
+ "@gradio/dataset": "^0.4.29",
21
+ "@gradio/dataframe": "^0.18.4",
22
+ "@gradio/datetime": "^0.3.18",
23
+ "@gradio/downloadbutton": "^0.4.8",
24
+ "@gradio/dropdown": "^0.9.25",
26
25
  "@gradio/fallback": "^0.4.25",
27
- "@gradio/fileexplorer": "^0.5.35",
26
+ "@gradio/file": "^0.12.25",
28
27
  "@gradio/form": "^0.2.21",
29
- "@gradio/gallery": "^0.15.27",
30
- "@gradio/group": "^0.2.0",
28
+ "@gradio/fileexplorer": "^0.5.36",
29
+ "@gradio/gallery": "^0.15.28",
31
30
  "@gradio/highlightedtext": "^0.9.8",
32
31
  "@gradio/html": "^0.6.17",
33
32
  "@gradio/icons": "^0.12.0",
34
- "@gradio/image": "^0.22.13",
35
- "@gradio/imageslider": "^0.2.9",
36
- "@gradio/imageeditor": "^0.16.1",
33
+ "@gradio/image": "^0.22.14",
34
+ "@gradio/imageeditor": "^0.16.2",
35
+ "@gradio/imageslider": "^0.2.10",
37
36
  "@gradio/json": "^0.5.27",
37
+ "@gradio/group": "^0.2.0",
38
38
  "@gradio/label": "^0.5.17",
39
+ "@gradio/model3d": "^0.14.22",
39
40
  "@gradio/markdown": "^0.13.18",
40
- "@gradio/model3d": "^0.14.21",
41
- "@gradio/multimodaltextbox": "^0.10.13",
42
41
  "@gradio/nativeplot": "^0.7.2",
42
+ "@gradio/multimodaltextbox": "^0.10.14",
43
43
  "@gradio/number": "^0.6.2",
44
44
  "@gradio/paramviewer": "^0.7.13",
45
45
  "@gradio/radio": "^0.7.8",
46
46
  "@gradio/plot": "^0.9.20",
47
- "@gradio/simpledropdown": "^0.3.25",
47
+ "@gradio/row": "^0.2.1",
48
48
  "@gradio/sidebar": "^0.1.18",
49
+ "@gradio/simpledropdown": "^0.3.25",
50
+ "@gradio/simpleimage": "^0.8.36",
49
51
  "@gradio/simpletextbox": "^0.3.26",
50
- "@gradio/row": "^0.2.1",
51
- "@gradio/simpleimage": "^0.8.35",
52
52
  "@gradio/sketchbox": "^0.6.13",
53
53
  "@gradio/statustracker": "^0.10.15",
54
- "@gradio/slider": "^0.6.14",
55
54
  "@gradio/state": "^0.1.2",
55
+ "@gradio/slider": "^0.6.14",
56
56
  "@gradio/tabitem": "^0.5.0",
57
57
  "@gradio/tabs": "^0.4.5",
58
58
  "@gradio/textbox": "^0.10.18",
59
- "@gradio/theme": "^0.4.0",
59
+ "@gradio/upload": "^0.16.12",
60
60
  "@gradio/timer": "^0.4.5",
61
- "@gradio/upload": "^0.16.11",
62
- "@gradio/uploadbutton": "^0.9.7",
61
+ "@gradio/uploadbutton": "^0.9.8",
62
+ "@gradio/theme": "^0.4.0",
63
63
  "@gradio/utils": "^0.10.2",
64
- "@gradio/video": "^0.14.21",
65
- "@gradio/wasm": "^0.18.1"
64
+ "@gradio/wasm": "^0.18.1",
65
+ "@gradio/video": "^0.14.22"
66
66
  },
67
67
  "msw": {
68
68
  "workerDirectory": "public"
@@ -15,7 +15,7 @@
15
15
  <h2>
16
16
  <img src={api_logo} alt="" />
17
17
  <div class="title">
18
- API documentation
18
+ {#if current_language === "mcp"}MCP{:else}API{/if} documentation
19
19
  <div class="url">
20
20
  {root}
21
21
  </div>
@@ -20,6 +20,7 @@
20
20
  import bash from "./img/bash.svg";
21
21
  import ResponseSnippet from "./ResponseSnippet.svelte";
22
22
  import mcp from "./img/mcp.svg";
23
+ import MCPSnippet from "./MCPSnippet.svelte";
23
24
 
24
25
  export let dependencies: Dependency[];
25
26
  export let root: string;
@@ -109,7 +110,27 @@
109
110
 
110
111
  const dispatch = createEventDispatcher();
111
112
 
112
- const mcp_server_url = `${root}gradio_api/mcp/sse`;
113
+ $: selected_tools_array = Array.from(selected_tools);
114
+ $: selected_tools_without_prefix =
115
+ selected_tools_array.map(remove_tool_prefix);
116
+ $: mcp_server_url = `${root}gradio_api/mcp/sse`;
117
+ $: mcp_server_url_streamable =
118
+ selected_tools_array.length > 0 &&
119
+ selected_tools_array.length < tools.length
120
+ ? `${root}gradio_api/mcp/?tools=${selected_tools_without_prefix.join(",")}`
121
+ : `${root}gradio_api/mcp/`;
122
+
123
+ $: if (mcp_json_sse && selected_tools.size > 0) {
124
+ const baseUrl =
125
+ selected_tools_array.length > 0 &&
126
+ selected_tools_array.length < tools.length
127
+ ? `${root}gradio_api/mcp/sse?tools=${selected_tools_without_prefix.join(",")}`
128
+ : `${root}gradio_api/mcp/sse`;
129
+ mcp_json_sse.mcpServers.gradio.url = baseUrl;
130
+ if (mcp_json_stdio) {
131
+ mcp_json_stdio.mcpServers.gradio.args[1] = baseUrl;
132
+ }
133
+ }
113
134
 
114
135
  interface ToolParameter {
115
136
  title?: string;
@@ -131,6 +152,15 @@
131
152
  let mcp_json_sse: any;
132
153
  let mcp_json_stdio: any;
133
154
  let file_data_present = false;
155
+ let selected_tools: Set<string> = new Set();
156
+ let tool_prefix = space_id ? space_id.split("/").pop() + "_" : "";
157
+
158
+ function remove_tool_prefix(toolName: string): string {
159
+ if (tool_prefix && toolName.startsWith(tool_prefix)) {
160
+ return toolName.slice(tool_prefix.length);
161
+ }
162
+ return toolName;
163
+ }
134
164
 
135
165
  const upload_file_mcp_server = {
136
166
  command: "uvx",
@@ -144,9 +174,10 @@
144
174
  ]
145
175
  };
146
176
 
147
- async function fetchMcpTools() {
177
+ async function fetch_mcp_tools() {
148
178
  try {
149
- const response = await fetch(`${root}gradio_api/mcp/schema`);
179
+ let schema_url = `${root}gradio_api/mcp/schema`;
180
+ const response = await fetch(schema_url);
150
181
  const schema = await response.json();
151
182
  file_data_present = schema
152
183
  .map((tool: any) => tool.meta?.file_data_present)
@@ -158,17 +189,20 @@
158
189
  parameters: tool.inputSchema?.properties || {},
159
190
  expanded: false
160
191
  }));
192
+ selected_tools = new Set(tools.map((tool) => tool.name));
161
193
  headers = schema.map((tool: any) => tool.meta?.headers || []).flat();
162
194
  if (headers.length > 0) {
163
195
  mcp_json_sse = {
164
196
  mcpServers: {
165
197
  gradio: {
166
198
  url: mcp_server_url,
167
- headers: headers.reduce((accumulator, current_key) => {
168
- // @ts-ignore
169
- accumulator[current_key] = "<YOUR_HEADER_VALUE>";
170
- return accumulator;
171
- }, {})
199
+ headers: headers.reduce(
200
+ (accumulator: Record<string, string>, current_key: string) => {
201
+ accumulator[current_key] = "<YOUR_HEADER_VALUE>";
202
+ return accumulator;
203
+ },
204
+ {}
205
+ )
172
206
  }
173
207
  }
174
208
  };
@@ -236,7 +270,7 @@
236
270
  .then((response) => {
237
271
  mcp_server_active = response.ok;
238
272
  if (mcp_server_active) {
239
- fetchMcpTools();
273
+ fetch_mcp_tools();
240
274
  if (!is_valid_language(lang_param)) {
241
275
  current_language = "mcp";
242
276
  }
@@ -335,135 +369,18 @@
335
369
  target="_blank">docs</a
336
370
  >) if you don't already have it installed.
337
371
  {:else if current_language == "mcp"}
338
- {#if mcp_server_active}
339
- <Block>
340
- <div class="mcp-url">
341
- <label
342
- ><span class="status-indicator active">●</span>MCP Server
343
- URL (SSE)</label
344
- >
345
- <div class="textbox">
346
- <input type="text" readonly value={mcp_server_url} />
347
- <CopyButton code={mcp_server_url} />
348
- </div>
349
- </div>
350
- </Block>
351
- <p>&nbsp;</p>
352
- <strong>Available MCP Tools</strong>
353
- <div class="mcp-tools">
354
- {#each tools as tool}
355
- <div class="tool-item">
356
- <button
357
- class="tool-header"
358
- on:click={() => (tool.expanded = !tool.expanded)}
359
- >
360
- <span
361
- ><span class="tool-name">{tool.name}</span> &nbsp;
362
- <span class="tool-description"
363
- >{tool.description
364
- ? tool.description
365
- : "⚠︎ No description provided in function docstring"}</span
366
- ></span
367
- >
368
- <span class="tool-arrow"
369
- >{tool.expanded ? "▼" : "▶"}</span
370
- >
371
- </button>
372
- {#if tool.expanded}
373
- <div class="tool-content">
374
- {#if Object.keys(tool.parameters).length > 0}
375
- <div class="tool-parameters">
376
- {#each Object.entries(tool.parameters) as [name, param]}
377
- <div class="parameter">
378
- <code>{name}</code>
379
- <span class="parameter-type">
380
- ({param.type}{param.default !== undefined
381
- ? `, default: ${JSON.stringify(param.default)}`
382
- : ""})
383
- </span>
384
- <p class="parameter-description">
385
- {param.description
386
- ? param.description
387
- : "⚠︎ No description for this parameter in function docstring"}
388
- </p>
389
- </div>
390
- {/each}
391
- </div>
392
- {:else}
393
- <p>Takes no input parameters</p>
394
- {/if}
395
- </div>
396
- {/if}
397
- </div>
398
- {/each}
399
- </div>
400
- <p>&nbsp;</p>
401
-
402
- <strong>SSE Transport</strong>: To add this MCP to clients that
403
- support SSE (e.g. Cursor, Windsurf, Cline), simply add the
404
- following configuration to your MCP config.
405
- <p>&nbsp;</p>
406
- <Block>
407
- <code>
408
- <div class="copy">
409
- <CopyButton
410
- code={JSON.stringify(mcp_json_sse, null, 2)}
411
- />
412
- </div>
413
- <div>
414
- <pre>{JSON.stringify(mcp_json_sse, null, 2)}</pre>
415
- </div>
416
- </code>
417
- </Block>
418
- {#if file_data_present}
419
- <p>&nbsp;</p>
420
- <em>Note about files</em>: Gradio MCP servers that have files
421
- as inputs need the files as URLs, so the
422
- <code>upload_files_to_gradio</code>
423
- tool is included for your convenience. This tool can upload files
424
- located in the specified <code>UPLOAD_DIRECTORY</code>
425
- argument (an absolute path in your local machine) or any of its
426
- subdirectories to the Gradio app. You can omit this tool if you
427
- are fine manually uploading files yourself and providing the URLs.
428
- Before using this tool, you must have
429
- <a
430
- href="https://docs.astral.sh/uv/getting-started/installation/"
431
- target="_blank">uv installed</a
432
- >.
433
- <p>&nbsp;</p>
434
- {/if}
435
-
436
- <strong>STDIO Transport</strong>: For clients that only support
437
- stdio (e.g. Claude Desktop), first
438
- <a href="https://nodejs.org/en/download/" target="_blank"
439
- >install Node.js</a
440
- >. Then, you can use the following command:
441
- <p>&nbsp;</p>
442
- <Block>
443
- <code>
444
- <div class="copy">
445
- <CopyButton
446
- code={JSON.stringify(mcp_json_stdio, null, 2)}
447
- />
448
- </div>
449
- <div>
450
- <pre>{JSON.stringify(mcp_json_stdio, null, 2)}</pre>
451
- </div>
452
- </code>
453
- </Block>
454
- <p>&nbsp;</p>
455
- <p>
456
- <a href={mcp_docs} target="_blank">
457
- Read more about MCP in the Gradio docs
458
- </a>
459
- </p>
460
- {:else}
461
- This Gradio app can also serve as an MCP server, with an MCP
462
- tool corresponding to each API endpoint. To enable this, launch
463
- this Gradio app with <code>.launch(mcp_server=True)</code> or
464
- set the <code>GRADIO_MCP_SERVER</code> env variable to
465
- <code>"True"</code>.
466
- {/if}
372
+ <MCPSnippet
373
+ {mcp_server_active}
374
+ {mcp_server_url}
375
+ {mcp_server_url_streamable}
376
+ tools={tools.filter((tool) => selected_tools.has(tool.name))}
377
+ all_tools={tools}
378
+ bind:selected_tools
379
+ {mcp_json_sse}
380
+ {mcp_json_stdio}
381
+ {file_data_present}
382
+ {mcp_docs}
383
+ />
467
384
  {:else}
468
385
  1. Confirm that you have cURL installed on your system.
469
386
  {/if}
@@ -637,6 +554,7 @@
637
554
  color: var(--body-text-color);
638
555
  line-height: 1;
639
556
  user-select: none;
557
+ font-size: var(--text-lg);
640
558
  }
641
559
 
642
560
  .current-lang {
@@ -657,7 +575,8 @@
657
575
 
658
576
  .snippet img {
659
577
  margin-right: var(--size-1-5);
660
- width: var(--size-3);
578
+ width: var(--size-4);
579
+ height: var(--size-4);
661
580
  }
662
581
 
663
582
  .header {
@@ -756,136 +675,4 @@
756
675
  .api-name {
757
676
  color: var(--color-accent);
758
677
  }
759
-
760
- .mcp-url {
761
- padding: var(--size-2);
762
- position: relative;
763
- }
764
-
765
- .mcp-url label {
766
- display: block;
767
- margin-bottom: var(--size-2);
768
- font-weight: 600;
769
- color: var(--body-text-color);
770
- }
771
-
772
- .mcp-url .textbox {
773
- display: flex;
774
- align-items: center;
775
- gap: var(--size-2);
776
- border: 1px solid var(--border-color-primary);
777
- border-radius: var(--radius-sm);
778
- padding: var(--size-2);
779
- background: var(--background-fill-primary);
780
- }
781
-
782
- .mcp-url input {
783
- flex: 1;
784
- border: none;
785
- background: none;
786
- color: var(--body-text-color);
787
- font-family: var(--font-mono);
788
- font-size: var(--text-md);
789
- width: 100%;
790
- }
791
-
792
- .mcp-url input:focus {
793
- outline: none;
794
- }
795
-
796
- .status-indicator {
797
- display: inline-block;
798
- margin-right: var(--size-1-5);
799
- position: relative;
800
- top: -1px;
801
- font-size: 0.8em;
802
- }
803
-
804
- .status-indicator.active {
805
- color: #4caf50;
806
- animation: pulse 1s infinite;
807
- }
808
-
809
- @keyframes pulse {
810
- 0% {
811
- opacity: 1;
812
- }
813
- 50% {
814
- opacity: 0.6;
815
- }
816
- 100% {
817
- opacity: 1;
818
- }
819
- }
820
-
821
- .mcp-tools {
822
- margin-top: var(--size-4);
823
- border: 1px solid var(--border-color-primary);
824
- border-radius: var(--radius-md);
825
- overflow: hidden;
826
- }
827
-
828
- .tool-item {
829
- border-bottom: 1px solid var(--border-color-primary);
830
- }
831
-
832
- .tool-item:last-child {
833
- border-bottom: none;
834
- }
835
-
836
- .tool-header {
837
- width: 100%;
838
- display: flex;
839
- justify-content: space-between;
840
- align-items: center;
841
- padding: var(--size-3);
842
- background: var(--background-fill-primary);
843
- border: none;
844
- cursor: pointer;
845
- text-align: left;
846
- }
847
-
848
- .tool-header:hover {
849
- background: var(--background-fill-secondary);
850
- }
851
-
852
- .tool-name {
853
- font-family: var(--font-mono);
854
- font-weight: 600;
855
- }
856
-
857
- .tool-arrow {
858
- color: var(--body-text-color-subdued);
859
- }
860
-
861
- .tool-content {
862
- padding: var(--size-3);
863
- background: var(--background-fill-secondary);
864
- }
865
-
866
- .tool-description {
867
- margin-bottom: var(--size-3);
868
- color: var(--body-text-color);
869
- }
870
- .parameter {
871
- margin-bottom: var(--size-2);
872
- padding: var(--size-2);
873
- background: var(--background-fill-primary);
874
- border-radius: var(--radius-sm);
875
- }
876
-
877
- .parameter code {
878
- font-weight: 600;
879
- color: var(--color-accent);
880
- }
881
-
882
- .parameter-type {
883
- color: var(--body-text-color-subdued);
884
- margin-left: var(--size-1);
885
- }
886
-
887
- .parameter-description {
888
- margin-top: var(--size-1);
889
- color: var(--body-text-color);
890
- }
891
678
  </style>