@gradio/core 1.0.0-dev.0 → 1.0.0-dev.3

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