@gradio/core 1.0.0-dev.0 → 1.0.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.
Files changed (109) hide show
  1. package/CHANGELOG.md +110 -0
  2. package/dist/index.d.ts +1 -1
  3. package/dist/index.js +1 -1
  4. package/dist/src/Blocks.svelte +534 -1001
  5. package/dist/src/Blocks.svelte.d.ts +32 -45
  6. package/dist/src/Embed.svelte +82 -55
  7. package/dist/src/Embed.svelte.d.ts +39 -30
  8. package/dist/src/Login.svelte +33 -29
  9. package/dist/src/Login.svelte.d.ts +21 -19
  10. package/dist/src/MountComponents.svelte +19 -25
  11. package/dist/src/MountComponents.svelte.d.ts +5 -28
  12. package/dist/src/{init.d.ts → _init.d.ts} +5 -4
  13. package/dist/src/{init.js → _init.js} +31 -108
  14. package/dist/src/api_docs/ApiBanner.svelte +12 -8
  15. package/dist/src/api_docs/ApiBanner.svelte.d.ts +22 -20
  16. package/dist/src/api_docs/ApiDocs.svelte +356 -247
  17. package/dist/src/api_docs/ApiDocs.svelte.d.ts +27 -24
  18. package/dist/src/api_docs/ApiRecorder.svelte +6 -3
  19. package/dist/src/api_docs/ApiRecorder.svelte.d.ts +19 -17
  20. package/dist/src/api_docs/CodeSnippet.svelte +122 -48
  21. package/dist/src/api_docs/CodeSnippet.svelte.d.ts +29 -25
  22. package/dist/src/api_docs/CopyButton.svelte +69 -13
  23. package/dist/src/api_docs/CopyButton.svelte.d.ts +18 -16
  24. package/dist/src/api_docs/CopyMarkdown.svelte +734 -0
  25. package/dist/src/api_docs/CopyMarkdown.svelte.d.ts +37 -0
  26. package/dist/src/api_docs/EndpointDetail.svelte +81 -23
  27. package/dist/src/api_docs/EndpointDetail.svelte.d.ts +23 -18
  28. package/dist/src/api_docs/IconArrowUpRight.svelte +34 -0
  29. package/dist/src/api_docs/IconArrowUpRight.svelte.d.ts +20 -0
  30. package/dist/src/api_docs/IconCaret.svelte +39 -0
  31. package/dist/src/api_docs/IconCaret.svelte.d.ts +20 -0
  32. package/dist/src/api_docs/IconHuggingChat.svelte +62 -0
  33. package/dist/src/api_docs/IconHuggingChat.svelte.d.ts +20 -0
  34. package/dist/src/api_docs/InputPayload.svelte +17 -11
  35. package/dist/src/api_docs/InputPayload.svelte.d.ts +25 -23
  36. package/dist/src/api_docs/InstallSnippet.svelte +9 -6
  37. package/dist/src/api_docs/InstallSnippet.svelte.d.ts +18 -16
  38. package/dist/src/api_docs/MCPSnippet.svelte +139 -126
  39. package/dist/src/api_docs/MCPSnippet.svelte.d.ts +60 -58
  40. package/dist/src/api_docs/NoApi.svelte +7 -4
  41. package/dist/src/api_docs/NoApi.svelte.d.ts +20 -18
  42. package/dist/src/api_docs/ParametersSnippet.svelte +8 -6
  43. package/dist/src/api_docs/ParametersSnippet.svelte.d.ts +21 -19
  44. package/dist/src/api_docs/PercentileChart.svelte +125 -0
  45. package/dist/src/api_docs/PercentileChart.svelte.d.ts +22 -0
  46. package/dist/src/api_docs/RecordingSnippet.svelte +124 -110
  47. package/dist/src/api_docs/RecordingSnippet.svelte.d.ts +24 -22
  48. package/dist/src/api_docs/ResponseSnippet.svelte +7 -5
  49. package/dist/src/api_docs/ResponseSnippet.svelte.d.ts +21 -19
  50. package/dist/src/api_docs/Settings.svelte +73 -62
  51. package/dist/src/api_docs/Settings.svelte.d.ts +25 -23
  52. package/dist/src/api_docs/SettingsBanner.svelte +11 -8
  53. package/dist/src/api_docs/SettingsBanner.svelte.d.ts +20 -18
  54. package/dist/src/api_docs/TryButton.svelte +5 -3
  55. package/dist/src/api_docs/TryButton.svelte.d.ts +19 -17
  56. package/dist/src/api_docs/img/IconCheck.svelte +33 -0
  57. package/dist/src/api_docs/img/IconCheck.svelte.d.ts +26 -0
  58. package/dist/src/api_docs/img/IconCopy.svelte +40 -0
  59. package/dist/src/api_docs/img/IconCopy.svelte.d.ts +26 -0
  60. package/dist/src/api_docs/img/clear.svelte.d.ts +22 -21
  61. package/dist/src/dependency.d.ts +145 -0
  62. package/dist/src/dependency.js +668 -0
  63. package/dist/src/init.svelte.d.ts +78 -0
  64. package/dist/src/init.svelte.js +469 -0
  65. package/dist/src/init_utils.d.ts +32 -0
  66. package/dist/src/init_utils.js +73 -0
  67. package/dist/src/lang/en.json +10 -1
  68. package/dist/src/lang/get_lang_names.js +0 -3
  69. package/dist/src/lang/ru.json +10 -1
  70. package/dist/src/stores.d.ts +0 -21
  71. package/dist/src/stories/I18nMultiLanguageTestComponent.svelte +5 -3
  72. package/dist/src/stories/I18nMultiLanguageTestComponent.svelte.d.ts +16 -14
  73. package/dist/src/stories/I18nTestSetup.svelte +14 -10
  74. package/dist/src/stories/I18nTestSetup.svelte.d.ts +18 -16
  75. package/dist/src/types.d.ts +31 -26
  76. package/index.ts +1 -1
  77. package/package.json +62 -63
  78. package/src/Blocks.svelte +360 -1063
  79. package/src/MountComponents.svelte +17 -27
  80. package/src/{init.ts → _init.ts} +49 -126
  81. package/src/api_docs/ApiDocs.svelte +84 -62
  82. package/src/api_docs/CodeSnippet.svelte +83 -24
  83. package/src/api_docs/CopyButton.svelte +61 -7
  84. package/src/api_docs/CopyMarkdown.svelte +734 -0
  85. package/src/api_docs/EndpointDetail.svelte +73 -17
  86. package/src/api_docs/IconArrowUpRight.svelte +34 -0
  87. package/src/api_docs/IconCaret.svelte +39 -0
  88. package/src/api_docs/IconHuggingChat.svelte +62 -0
  89. package/src/api_docs/MCPSnippet.svelte +44 -73
  90. package/src/api_docs/ParametersSnippet.svelte +1 -1
  91. package/src/api_docs/PercentileChart.svelte +125 -0
  92. package/src/api_docs/ResponseSnippet.svelte +1 -1
  93. package/src/api_docs/Settings.svelte +11 -11
  94. package/src/api_docs/img/IconCheck.svelte +33 -0
  95. package/src/api_docs/img/IconCopy.svelte +40 -0
  96. package/src/dependency.ts +909 -0
  97. package/src/init.svelte.ts +717 -0
  98. package/src/init_utils.ts +99 -0
  99. package/src/lang/en.json +10 -1
  100. package/src/lang/get_lang_names.js +0 -3
  101. package/src/lang/ru.json +10 -1
  102. package/src/stores.ts +22 -22
  103. package/src/types.ts +55 -43
  104. package/dist/src/Render.svelte +0 -105
  105. package/dist/src/Render.svelte.d.ts +0 -31
  106. package/dist/src/RenderComponent.svelte +0 -72
  107. package/dist/src/RenderComponent.svelte.d.ts +0 -33
  108. package/src/Render.svelte +0 -126
  109. package/src/RenderComponent.svelte +0 -91
@@ -1,230 +1,309 @@
1
- <script>import { onMount, createEventDispatcher } from "svelte";
2
- import NoApi from "./NoApi.svelte";
3
- import ApiBanner from "./ApiBanner.svelte";
4
- import { BaseButton as Button } from "@gradio/button";
5
- import ParametersSnippet from "./ParametersSnippet.svelte";
6
- import InstallSnippet from "./InstallSnippet.svelte";
7
- import CodeSnippet from "./CodeSnippet.svelte";
8
- import RecordingSnippet from "./RecordingSnippet.svelte";
9
- import CopyButton from "./CopyButton.svelte";
10
- import { Block } from "@gradio/atoms";
11
- import python from "./img/python.svg";
12
- import javascript from "./img/javascript.svg";
13
- import bash from "./img/bash.svg";
14
- import ResponseSnippet from "./ResponseSnippet.svelte";
15
- import mcp from "./img/mcp.svg";
16
- import MCPSnippet from "./MCPSnippet.svelte";
17
- export let dependencies;
18
- export let root;
19
- export let app;
20
- export let space_id;
21
- export let root_node;
22
- export let username;
23
- const js_docs = "https://www.gradio.app/guides/getting-started-with-the-js-client";
24
- const py_docs = "https://www.gradio.app/guides/getting-started-with-the-python-client";
25
- const bash_docs = "https://www.gradio.app/guides/querying-gradio-apps-with-curl";
26
- const spaces_docs_suffix = "#connecting-to-a-hugging-face-space";
27
- const mcp_docs = "https://www.gradio.app/guides/building-mcp-server-with-gradio";
28
- let api_count = dependencies.filter(
29
- (dependency) => dependency.api_visibility === "public"
30
- ).length;
31
- if (root === "") {
32
- root = location.protocol + "//" + location.host + location.pathname;
33
- }
34
- if (!root.endsWith("/")) {
35
- root += "/";
36
- }
37
- export let api_calls = [];
38
- let current_language = "python";
39
- function set_query_param(key, value) {
40
- const url = new URL(window.location.href);
41
- url.searchParams.set(key, value);
42
- history.replaceState(null, "", url.toString());
43
- }
44
- function get_query_param(key) {
45
- const url = new URL(window.location.href);
46
- return url.searchParams.get(key);
47
- }
48
- function is_valid_language(lang) {
49
- return ["python", "javascript", "bash", "mcp"].includes(lang ?? "");
50
- }
51
- const langs = [
52
- ["python", "Python", python],
53
- ["javascript", "JavaScript", javascript],
54
- ["bash", "cURL", bash],
55
- ["mcp", "MCP", mcp]
56
- ];
57
- let is_running = false;
58
- let mcp_server_active = false;
59
- async function get_info() {
60
- let response = await fetch(
61
- root.replace(/\/$/, "") + app.api_prefix + "/info"
62
- );
63
- let data = await response.json();
64
- return data;
65
- }
66
- async function get_js_info() {
67
- let js_api_info = await app.view_api();
68
- return js_api_info;
69
- }
70
- let info;
71
- let js_info;
72
- let analytics;
73
- get_info().then((data) => {
74
- info = data;
75
- });
76
- get_js_info().then((js_api_info) => {
77
- js_info = js_api_info;
78
- });
79
- async function get_summary() {
80
- let response = await fetch(root.replace(/\/$/, "") + "/monitoring/summary");
81
- let data = await response.json();
82
- return data;
83
- }
84
- get_summary().then((summary) => {
85
- analytics = summary.functions;
86
- });
87
- const dispatch = createEventDispatcher();
88
- $: selected_tools_array = Array.from(selected_tools);
89
- $: selected_tools_without_prefix = selected_tools_array.map(remove_tool_prefix);
90
- $: mcp_server_url = `${root}gradio_api/mcp/sse`;
91
- $: mcp_server_url_streamable = selected_tools_array.length > 0 && selected_tools_array.length < tools.length ? `${root}gradio_api/mcp/?tools=${selected_tools_without_prefix.join(",")}` : `${root}gradio_api/mcp/`;
92
- $: if (mcp_json_sse && selected_tools.size > 0) {
93
- const baseUrl = selected_tools_array.length > 0 && selected_tools_array.length < tools.length ? `${root}gradio_api/mcp/sse?tools=${selected_tools_without_prefix.join(",")}` : `${root}gradio_api/mcp/sse`;
94
- mcp_json_sse.mcpServers.gradio.url = baseUrl;
95
- if (mcp_json_stdio) {
96
- mcp_json_stdio.mcpServers.gradio.args[1] = baseUrl;
97
- }
98
- }
99
- let tools = [];
100
- let headers = [];
101
- let mcp_json_sse;
102
- let mcp_json_stdio;
103
- let file_data_present = false;
104
- let selected_tools = /* @__PURE__ */ new Set();
105
- let tool_prefix = space_id ? space_id.split("/").pop() + "_" : "";
106
- function remove_tool_prefix(toolName) {
107
- if (tool_prefix && toolName.startsWith(tool_prefix)) {
108
- return toolName.slice(tool_prefix.length);
109
- }
110
- return toolName;
111
- }
112
- const upload_file_mcp_server = {
113
- command: "uvx",
114
- args: [
115
- "--from",
116
- "gradio[mcp]",
117
- "gradio",
118
- "upload-mcp",
119
- root,
120
- "<UPLOAD_DIRECTORY>"
121
- ]
122
- };
123
- async function fetch_mcp_tools() {
124
- try {
125
- let schema_url = `${root}gradio_api/mcp/schema`;
126
- const response = await fetch(schema_url);
127
- const schema = await response.json();
128
- file_data_present = schema.map((tool) => tool.meta?.file_data_present).some((present) => present);
129
- tools = schema.map((tool) => ({
130
- name: tool.name,
131
- description: tool.description || "",
132
- parameters: tool.inputSchema?.properties || {},
133
- meta: tool.meta,
134
- expanded: false,
135
- endpoint_name: tool.endpoint_name
136
- }));
137
- selected_tools = new Set(tools.map((tool) => tool.name));
138
- headers = schema.map((tool) => tool.meta?.headers || []).flat();
139
- if (headers.length > 0) {
140
- mcp_json_sse = {
141
- mcpServers: {
142
- gradio: {
143
- url: mcp_server_url,
144
- headers: headers.reduce(
145
- (accumulator, current_key) => {
146
- accumulator[current_key] = "<YOUR_HEADER_VALUE>";
147
- return accumulator;
148
- },
149
- {}
150
- )
151
- }
152
- }
153
- };
154
- mcp_json_stdio = {
155
- mcpServers: {
156
- gradio: {
157
- command: "npx",
158
- args: [
159
- "mcp-remote",
160
- mcp_server_url,
161
- "--transport",
162
- "sse-only",
163
- ...headers.map((header) => [
164
- "--header",
165
- `${header}: <YOUR_HEADER_VALUE>`
166
- ]).flat()
167
- ]
168
- }
169
- }
170
- };
171
- } else {
172
- mcp_json_sse = {
173
- mcpServers: {
174
- gradio: {
175
- url: mcp_server_url
176
- }
177
- }
178
- };
179
- mcp_json_stdio = {
180
- mcpServers: {
181
- gradio: {
182
- command: "npx",
183
- args: ["mcp-remote", mcp_server_url, "--transport", "sse-only"]
184
- }
185
- }
186
- };
187
- if (file_data_present) {
188
- mcp_json_sse.mcpServers.upload_files_to_gradio = upload_file_mcp_server;
189
- mcp_json_stdio.mcpServers.upload_files_to_gradio = upload_file_mcp_server;
190
- }
191
- }
192
- } catch (error) {
193
- console.error("Failed to fetch MCP tools:", error);
194
- tools = [];
195
- }
196
- }
197
- onMount(() => {
198
- const controller = new AbortController();
199
- const signal = controller.signal;
200
- document.body.style.overflow = "hidden";
201
- if ("parentIFrame" in window) {
202
- window.parentIFrame?.scrollTo(0, 0);
203
- }
204
- const lang_param = get_query_param("lang");
205
- if (is_valid_language(lang_param)) {
206
- current_language = lang_param;
207
- }
208
- fetch(mcp_server_url, { signal }).then((response) => {
209
- mcp_server_active = response.ok;
210
- if (mcp_server_active) {
211
- fetch_mcp_tools();
212
- if (!is_valid_language(lang_param)) {
213
- current_language = "mcp";
214
- }
215
- } else {
216
- if (!is_valid_language(lang_param)) {
217
- current_language = "python";
218
- }
219
- }
220
- controller.abort();
221
- }).catch(() => {
222
- mcp_server_active = false;
223
- });
224
- return () => {
225
- document.body.style.overflow = "auto";
226
- };
227
- });
1
+ <script lang="ts">
2
+ /* eslint-disable */
3
+ import { onMount, createEventDispatcher } from "svelte";
4
+ import type { ComponentMeta, Dependency } from "../types";
5
+ import NoApi from "./NoApi.svelte";
6
+ import type { Client } from "@gradio/client";
7
+ import type { Payload } from "../types";
8
+
9
+ import ApiBanner from "./ApiBanner.svelte";
10
+ import { BaseButton as Button } from "@gradio/button";
11
+ import ParametersSnippet from "./ParametersSnippet.svelte";
12
+ import InstallSnippet from "./InstallSnippet.svelte";
13
+ import CodeSnippet from "./CodeSnippet.svelte";
14
+ import RecordingSnippet from "./RecordingSnippet.svelte";
15
+ import CopyButton from "./CopyButton.svelte";
16
+ import { Block } from "@gradio/atoms";
17
+
18
+ import python from "./img/python.svg";
19
+ import javascript from "./img/javascript.svg";
20
+ import bash from "./img/bash.svg";
21
+ import ResponseSnippet from "./ResponseSnippet.svelte";
22
+ import mcp from "./img/mcp.svg";
23
+ import MCPSnippet from "./MCPSnippet.svelte";
24
+ import CopyMarkdown from "./CopyMarkdown.svelte";
25
+
26
+ export let dependencies: Dependency[];
27
+ export let root: string;
28
+ export let app: Awaited<ReturnType<typeof Client.connect>>;
29
+ export let space_id: string | null;
30
+ export let root_node: ComponentMeta;
31
+ export let username: string | null;
32
+ export let last_api_call: Payload | null = null;
33
+
34
+ const js_docs =
35
+ "https://www.gradio.app/guides/getting-started-with-the-js-client";
36
+ const py_docs =
37
+ "https://www.gradio.app/guides/getting-started-with-the-python-client";
38
+ const bash_docs =
39
+ "https://www.gradio.app/guides/querying-gradio-apps-with-curl";
40
+ const spaces_docs_suffix = "#connecting-to-a-hugging-face-space";
41
+ const mcp_docs =
42
+ "https://www.gradio.app/guides/building-mcp-server-with-gradio";
43
+
44
+ let api_count = dependencies.filter(
45
+ (dependency) => dependency.api_visibility === "public"
46
+ ).length;
47
+
48
+ if (root === "") {
49
+ root = location.protocol + "//" + location.host + location.pathname;
50
+ }
51
+ if (!root.endsWith("/")) {
52
+ root += "/";
53
+ }
54
+
55
+ export let api_calls: Payload[] = [];
56
+ let current_language: "python" | "javascript" | "bash" | "mcp" = "python";
57
+
58
+ $: sorted_dependencies = (() => {
59
+ const valid = dependencies.filter(
60
+ (dep) =>
61
+ dep.api_visibility === "public" &&
62
+ info?.named_endpoints?.["/" + dep.api_name]
63
+ );
64
+ if (info && last_api_call) {
65
+ const mostRecent = valid.find((dep) => dep.id === last_api_call.fn_index);
66
+ const others = valid.filter((dep) => dep.id !== last_api_call.fn_index);
67
+ return mostRecent ? [mostRecent, ...others] : valid;
68
+ }
69
+ return valid;
70
+ })();
71
+
72
+ function set_query_param(key: string, value: string) {
73
+ const url = new URL(window.location.href);
74
+ url.searchParams.set(key, value);
75
+ history.replaceState(null, "", url.toString());
76
+ }
77
+
78
+ function get_query_param(key: string): string | null {
79
+ const url = new URL(window.location.href);
80
+ return url.searchParams.get(key);
81
+ }
82
+
83
+ function is_valid_language(lang: string | null): boolean {
84
+ return ["python", "javascript", "bash", "mcp"].includes(lang ?? "");
85
+ }
86
+
87
+ const langs = [
88
+ ["python", "Python", python],
89
+ ["javascript", "JavaScript", javascript],
90
+ ["bash", "cURL", bash],
91
+ ["mcp", "MCP", mcp]
92
+ ] as const;
93
+
94
+ let is_running = false;
95
+ let mcp_server_active = false;
96
+
97
+ async function get_info(): Promise<{
98
+ named_endpoints: any;
99
+ unnamed_endpoints: any;
100
+ }> {
101
+ let response = await fetch(
102
+ root.replace(/\/$/, "") + app.api_prefix + "/info"
103
+ );
104
+ let data = await response.json();
105
+ return data;
106
+ }
107
+ async function get_js_info(): Promise<Record<string, any>> {
108
+ let js_api_info = await app.view_api();
109
+ return js_api_info;
110
+ }
111
+
112
+ let info: {
113
+ named_endpoints: any;
114
+ unnamed_endpoints: any;
115
+ };
116
+
117
+ let js_info: Record<string, any>;
118
+ let analytics: Record<string, any>;
119
+
120
+ get_info().then((data) => {
121
+ info = data;
122
+ });
123
+
124
+ get_js_info().then((js_api_info) => {
125
+ js_info = js_api_info;
126
+ });
127
+
128
+ async function get_summary(): Promise<{
129
+ functions: any;
130
+ }> {
131
+ let response = await fetch(root.replace(/\/$/, "") + "/monitoring/summary");
132
+ let data = await response.json();
133
+ return data;
134
+ }
135
+
136
+ get_summary().then((summary) => {
137
+ analytics = summary.functions;
138
+ });
139
+
140
+ const dispatch = createEventDispatcher();
141
+
142
+ $: selected_tools_array = Array.from(selected_tools);
143
+ $: selected_tools_without_prefix =
144
+ selected_tools_array.map(remove_tool_prefix);
145
+ $: mcp_server_url_streamable =
146
+ selected_tools_array.length > 0 &&
147
+ selected_tools_array.length < tools.length
148
+ ? `${root}gradio_api/mcp/?tools=${selected_tools_without_prefix.join(",")}`
149
+ : `${root}gradio_api/mcp/`;
150
+
151
+ interface ToolParameter {
152
+ title?: string;
153
+ type: string;
154
+ description: string;
155
+ format?: string;
156
+ default?: any;
157
+ }
158
+
159
+ interface Tool {
160
+ name: string;
161
+ description: string;
162
+ parameters: Record<string, ToolParameter>;
163
+ expanded?: boolean;
164
+ meta: {
165
+ mcp_type: "tool" | "resource" | "prompt";
166
+ file_data_present: boolean;
167
+ endpoint_name: string;
168
+ };
169
+ }
170
+
171
+ let tools: Tool[] = [];
172
+ let headers: string[] = [];
173
+ let mcp_json_stdio: any;
174
+ let file_data_present = false;
175
+ let selected_tools: Set<string> = new Set();
176
+ let tool_prefix = space_id ? space_id.split("/").pop() + "_" : "";
177
+
178
+ function remove_tool_prefix(toolName: string): string {
179
+ if (tool_prefix && toolName.startsWith(tool_prefix)) {
180
+ return toolName.slice(tool_prefix.length);
181
+ }
182
+ return toolName;
183
+ }
184
+
185
+ const upload_file_mcp_server = {
186
+ command: "uvx",
187
+ args: [
188
+ "--from",
189
+ "gradio[mcp]",
190
+ "gradio",
191
+ "upload-mcp",
192
+ root,
193
+ "<UPLOAD_DIRECTORY>"
194
+ ]
195
+ };
196
+
197
+ async function fetch_mcp_tools() {
198
+ try {
199
+ let schema_url = `${root}gradio_api/mcp/schema`;
200
+ const response = await fetch(schema_url);
201
+ const schema = await response.json();
202
+ file_data_present = schema
203
+ .map((tool: any) => tool.meta?.file_data_present)
204
+ .some((present: boolean) => present);
205
+
206
+ tools = schema.map((tool: any) => ({
207
+ name: tool.name,
208
+ description: tool.description || "",
209
+ parameters: tool.inputSchema?.properties || {},
210
+ meta: tool.meta,
211
+ expanded: false,
212
+ endpoint_name: tool.endpoint_name
213
+ }));
214
+ selected_tools = new Set(tools.map((tool) => tool.name));
215
+ headers = schema.map((tool: any) => tool.meta?.headers || []).flat();
216
+ if (headers.length > 0) {
217
+ mcp_json_stdio = {
218
+ mcpServers: {
219
+ gradio: {
220
+ command: "npx",
221
+ args: [
222
+ "mcp-remote",
223
+ mcp_server_url_streamable,
224
+ "--transport",
225
+ "streamable-http",
226
+ ...headers
227
+ .map((header) => [
228
+ "--header",
229
+ `${header}: <YOUR_HEADER_VALUE>`
230
+ ])
231
+ .flat()
232
+ ]
233
+ }
234
+ }
235
+ };
236
+ } else {
237
+ mcp_json_stdio = {
238
+ mcpServers: {
239
+ gradio: {
240
+ command: "npx",
241
+ args: [
242
+ "mcp-remote",
243
+ mcp_server_url_streamable,
244
+ "--transport",
245
+ "streamable-http"
246
+ ]
247
+ }
248
+ }
249
+ };
250
+ if (file_data_present) {
251
+ mcp_json_stdio.mcpServers.upload_files_to_gradio =
252
+ upload_file_mcp_server;
253
+ }
254
+ }
255
+ } catch (error) {
256
+ console.error("Failed to fetch MCP tools:", error);
257
+ tools = [];
258
+ }
259
+ }
260
+
261
+ let markdown_code_snippets: Record<string, Record<string, string>> = {};
262
+
263
+ $: markdown_code_snippets;
264
+
265
+ let config_snippets: Record<string, string> = {};
266
+
267
+ $: config_snippets;
268
+
269
+ onMount(() => {
270
+ const controller = new AbortController();
271
+ const signal = controller.signal;
272
+
273
+ document.body.style.overflow = "hidden";
274
+ if ("parentIFrame" in window) {
275
+ window.parentIFrame?.scrollTo(0, 0);
276
+ }
277
+
278
+ const lang_param = get_query_param("lang");
279
+ if (is_valid_language(lang_param)) {
280
+ current_language = lang_param as "python" | "javascript" | "bash" | "mcp";
281
+ }
282
+
283
+ const mcp_schema_url = `${root}gradio_api/mcp/schema`;
284
+ fetch(mcp_schema_url, { signal: signal })
285
+ .then((response) => {
286
+ mcp_server_active = response.ok;
287
+ if (mcp_server_active) {
288
+ fetch_mcp_tools();
289
+ if (!is_valid_language(lang_param)) {
290
+ current_language = "mcp";
291
+ }
292
+ } else {
293
+ if (!is_valid_language(lang_param)) {
294
+ current_language = "python";
295
+ }
296
+ }
297
+ controller.abort();
298
+ })
299
+ .catch(() => {
300
+ mcp_server_active = false;
301
+ });
302
+
303
+ return () => {
304
+ document.body.style.overflow = "auto";
305
+ };
306
+ });
228
307
  </script>
229
308
 
230
309
  {#if info && analytics}
@@ -239,10 +318,32 @@ onMount(() => {
239
318
  </div>
240
319
 
241
320
  <div class="docs-wrap">
242
- <div class="client-doc">
321
+ <div
322
+ class="client-doc"
323
+ style="display: flex; align-items: center; justify-content: space-between;"
324
+ >
243
325
  <p style="font-size: var(--text-lg);">
244
326
  Choose one of the following ways to interact with the API.
245
327
  </p>
328
+ <CopyMarkdown
329
+ {current_language}
330
+ {space_id}
331
+ {root}
332
+ {api_count}
333
+ {tools}
334
+ {py_docs}
335
+ {js_docs}
336
+ {bash_docs}
337
+ {mcp_docs}
338
+ {spaces_docs_suffix}
339
+ {mcp_server_active}
340
+ {mcp_server_url_streamable}
341
+ {config_snippets}
342
+ {markdown_code_snippets}
343
+ {dependencies}
344
+ {info}
345
+ {js_info}
346
+ />
246
347
  </div>
247
348
  <div class="endpoint">
248
349
  <div class="snippets">
@@ -305,25 +406,27 @@ onMount(() => {
305
406
  href={current_language == "python" ? py_docs : js_docs}
306
407
  target="_blank">docs</a
307
408
  >) if you don't already have it installed.
308
- {:else if current_language == "mcp"}
309
- <MCPSnippet
310
- {mcp_server_active}
311
- {mcp_server_url}
312
- {mcp_server_url_streamable}
313
- tools={tools.filter((tool) => selected_tools.has(tool.name))}
314
- all_tools={tools}
315
- bind:selected_tools
316
- {mcp_json_sse}
317
- {mcp_json_stdio}
318
- {file_data_present}
319
- {mcp_docs}
320
- {analytics}
321
- />
322
- {:else}
409
+ {:else if current_language == "bash"}
323
410
  1. Confirm that you have cURL installed on your system.
324
411
  {/if}
325
412
  </p>
326
413
 
414
+ <div class:hidden={current_language !== "mcp"}>
415
+ <MCPSnippet
416
+ {mcp_server_active}
417
+ {mcp_server_url_streamable}
418
+ tools={tools.filter((tool) => selected_tools.has(tool.name))}
419
+ all_tools={tools}
420
+ bind:selected_tools
421
+ {mcp_json_stdio}
422
+ {file_data_present}
423
+ {mcp_docs}
424
+ {analytics}
425
+ {root}
426
+ bind:config_snippets
427
+ />
428
+ </div>
429
+
327
430
  {#if current_language !== "mcp"}
328
431
  <InstallSnippet {current_language} />
329
432
 
@@ -377,9 +480,9 @@ onMount(() => {
377
480
  {/if}
378
481
  {/if}
379
482
 
380
- {#if current_language !== "mcp"}
381
- {#each dependencies as dependency}
382
- {#if dependency.api_visibility === "public" && info.named_endpoints["/" + dependency.api_name]}
483
+ <div class:hidden={current_language === "mcp"}>
484
+ {#each sorted_dependencies as dependency}
485
+ {#if info.named_endpoints["/" + dependency.api_name]}
383
486
  <div class="endpoint-container">
384
487
  <CodeSnippet
385
488
  endpoint_parameters={info.named_endpoints[
@@ -395,6 +498,8 @@ onMount(() => {
395
498
  "/" + dependency.api_name
396
499
  ].description}
397
500
  {analytics}
501
+ {last_api_call}
502
+ bind:markdown_code_snippets
398
503
  />
399
504
 
400
505
  <ParametersSnippet
@@ -419,7 +524,7 @@ onMount(() => {
419
524
  </div>
420
525
  {/if}
421
526
  {/each}
422
- {/if}
527
+ </div>
423
528
  </div>
424
529
  </div>
425
530
  {:else}
@@ -614,4 +719,8 @@ onMount(() => {
614
719
  .api-name {
615
720
  color: var(--color-accent);
616
721
  }
722
+
723
+ .hidden {
724
+ display: none;
725
+ }
617
726
  </style>