@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,30 +1,45 @@
1
1
  <script lang="ts">
2
+ import type { Payload } from "../types";
2
3
  export let api_name: string | null = null;
3
4
  export let description: string | null = null;
4
5
  export let analytics: Record<string, any>;
6
+ export let last_api_call: Payload | null = null;
7
+ export let dependency_id: number | null = null;
5
8
  import { format_latency, get_color_from_success_rate } from "./utils";
9
+ import PercentileChart from "./PercentileChart.svelte";
6
10
 
7
11
  const success_rate = api_name ? analytics[api_name]?.success_rate : 0;
8
12
  const color = get_color_from_success_rate(success_rate);
13
+ $: is_most_recently_used = last_api_call?.fn_index === dependency_id;
9
14
  </script>
10
15
 
11
16
  <h3>
12
17
  API name:
13
18
  <span class="post">{"/" + api_name}</span>
14
- <span class="desc">{description}</span>
15
- {#if analytics && api_name && analytics[api_name]}
16
- <span class="analytics">
17
- Total requests: {analytics[api_name].total_requests} (<span style={color}
18
- >{Math.round(success_rate * 100)}%</span
19
- >
20
- successful) &nbsp;|&nbsp; p50/p90/p99:
21
- {format_latency(analytics[api_name].process_time_percentiles["50th"])}
22
- /
23
- {format_latency(analytics[api_name].process_time_percentiles["90th"])}
24
- /
25
- {format_latency(analytics[api_name].process_time_percentiles["99th"])}
26
- </span>
27
- {/if}
19
+ <span class="desc">
20
+ {description}
21
+ {#if analytics && api_name && analytics[api_name]}
22
+ {@const endpoint_analytics = analytics[api_name]}
23
+ {@const p50 = endpoint_analytics.process_time_percentiles["50th"]}
24
+ {@const p90 = endpoint_analytics.process_time_percentiles["90th"]}
25
+ {@const p99 = endpoint_analytics.process_time_percentiles["99th"]}
26
+ <span class="analytics-inline">
27
+ <span class="analytics-content">
28
+ <span class="analytics-text-wrapper">
29
+ {endpoint_analytics.total_requests} requests ({Math.round(
30
+ success_rate * 100
31
+ )}% successful, p50: {format_latency(p50)})
32
+ </span>
33
+ <div class="analytics-tooltip">
34
+ <PercentileChart {p50} {p90} {p99} />
35
+ </div>
36
+ </span>
37
+ {#if is_most_recently_used}
38
+ <span class="most-recently-used">Most recently used</span>
39
+ {/if}
40
+ </span>
41
+ {/if}
42
+ </span>
28
43
  </h3>
29
44
 
30
45
  <style>
@@ -46,14 +61,55 @@
46
61
  font-weight: var(--weight-semibold);
47
62
  }
48
63
 
49
- .analytics {
64
+ .analytics-inline {
65
+ display: inline-flex;
66
+ align-items: center;
67
+ gap: var(--size-2);
68
+ margin-left: var(--size-2);
50
69
  color: var(--body-text-color-subdued);
51
- margin-top: var(--size-1);
70
+ }
71
+
72
+ .analytics-content {
73
+ position: relative;
74
+ display: inline-block;
75
+ }
76
+
77
+ .analytics-text-wrapper {
78
+ cursor: help;
79
+ }
80
+
81
+ .analytics-tooltip {
82
+ position: absolute;
83
+ bottom: 100%;
84
+ left: 50%;
85
+ transform: translateX(-50%);
86
+ margin-bottom: var(--size-2);
87
+ opacity: 0;
88
+ pointer-events: none;
89
+ transition: opacity 0.2s ease;
90
+ z-index: 1000;
91
+ }
92
+
93
+ .analytics-content:hover .analytics-tooltip {
94
+ opacity: 1;
95
+ pointer-events: auto;
96
+ }
97
+
98
+ .most-recently-used {
99
+ display: inline-block;
100
+ color: #fd7b00;
101
+ background: #fff4e6;
102
+ border: 1px solid #ffd9b3;
103
+ border-radius: var(--radius-sm);
104
+ padding: var(--size-1) var(--size-2);
105
+ font-size: var(--text-sm);
106
+ font-weight: var(--weight-medium);
107
+ white-space: nowrap;
52
108
  }
53
109
 
54
110
  .desc {
55
111
  color: var(--body-text-color);
56
112
  font-size: var(--text-lg);
57
- margin-top: var(--size-1);
113
+ margin-left: var(--size-2);
58
114
  }
59
115
  </style>
@@ -0,0 +1,34 @@
1
+ <script lang="ts">
2
+ export let classNames = "";
3
+ </script>
4
+
5
+ <svg
6
+ class={classNames || "menu-icon-arrow"}
7
+ xmlns="http://www.w3.org/2000/svg"
8
+ width="24"
9
+ height="24"
10
+ viewBox="0 0 24 24"
11
+ fill="none"
12
+ stroke="currentColor"
13
+ stroke-width="1.75"
14
+ stroke-linecap="round"
15
+ stroke-linejoin="round"
16
+ >
17
+ <path d="M7 7h10v10"></path>
18
+ <path d="M7 17 17 7"></path>
19
+ </svg>
20
+
21
+ <style>
22
+ .menu-icon-arrow {
23
+ width: 1rem;
24
+ height: 1rem;
25
+ color: rgb(107, 114, 128);
26
+ flex-shrink: 0;
27
+ }
28
+
29
+ @media (prefers-color-scheme: dark) {
30
+ .menu-icon-arrow {
31
+ color: rgb(209, 213, 219);
32
+ }
33
+ }
34
+ </style>
@@ -0,0 +1,39 @@
1
+ <script lang="ts">
2
+ export let classNames = "";
3
+ </script>
4
+
5
+ <svg
6
+ class={classNames}
7
+ width="1em"
8
+ height="1em"
9
+ viewBox="0 0 12 7"
10
+ fill="none"
11
+ xmlns="http://www.w3.org/2000/svg"
12
+ >
13
+ <path d="M1 1L6 6L11 1" stroke="currentColor" />
14
+ </svg>
15
+
16
+ <style>
17
+ .caret-icon {
18
+ transition: transform 0.2s ease-in-out;
19
+ color: rgb(156, 163, 175);
20
+ overflow: visible;
21
+ width: 0.75rem;
22
+ height: 0.75rem;
23
+ }
24
+
25
+ @media (max-width: 640px) {
26
+ .caret-icon {
27
+ width: 0.625rem;
28
+ height: 0.625rem;
29
+ }
30
+ }
31
+
32
+ .rotate-180 {
33
+ transform: rotate(180deg);
34
+ }
35
+
36
+ .rotate-0 {
37
+ transform: rotate(0deg);
38
+ }
39
+ </style>
@@ -0,0 +1,62 @@
1
+ <script lang="ts">
2
+ export let classNames = "";
3
+ </script>
4
+
5
+ <svg
6
+ class={classNames || "icon-size"}
7
+ width="1em"
8
+ height="1em"
9
+ viewBox="5 5 22 22"
10
+ fill="none"
11
+ xmlns="http://www.w3.org/2000/svg"
12
+ >
13
+ <title>HuggingChat</title>
14
+ <path
15
+ d="M16.0006 25.9992C13.8266 25.999 11.7118 25.2901 9.97686 23.9799C8.2419 22.6698 6.98127 20.8298 6.38599 18.7388C5.79071 16.6478 5.89323 14.4198 6.678 12.3923C7.46278 10.3648 8.88705 8.64837 10.735 7.50308C12.5829 6.35779 14.7538 5.84606 16.9187 6.04544C19.0837 6.24481 21.1246 7.14442 22.7323 8.60795C24.34 10.0715 25.4268 12.0192 25.8281 14.1559C26.2293 16.2926 25.9232 18.5019 24.9561 20.449C24.7703 20.8042 24.7223 21.2155 24.8211 21.604L25.4211 23.8316C25.4803 24.0518 25.4805 24.2837 25.4216 24.5039C25.3627 24.7242 25.2468 24.925 25.0856 25.0862C24.9244 25.2474 24.7235 25.3633 24.5033 25.4222C24.283 25.4811 24.0512 25.4809 23.831 25.4217L21.6034 24.8217C21.2172 24.7248 20.809 24.7729 20.4558 24.9567C19.0683 25.6467 17.5457 26.0068 16.0006 26.0068V25.9992Z"
16
+ fill="black"
17
+ class="block dark:hidden"
18
+ />
19
+ <path
20
+ d="M9.62598 16.0013C9.62598 15.3799 10.1294 14.8765 10.7508 14.8765C11.3721 14.8765 11.8756 15.3799 11.8756 16.0013C11.8756 17.0953 12.3102 18.1448 13.0838 18.9184C13.8574 19.692 14.9069 20.1266 16.001 20.1267C17.095 20.1267 18.1445 19.692 18.9181 18.9184C19.6918 18.1448 20.1264 17.0953 20.1264 16.0013C20.1264 15.3799 20.6299 14.8765 21.2512 14.8765C21.8725 14.8765 22.3759 15.3799 22.3759 16.0013C22.3759 17.6921 21.7046 19.3137 20.509 20.5093C19.3134 21.7049 17.6918 22.3762 16.001 22.3762C14.3102 22.3762 12.6885 21.7049 11.4929 20.5093C10.2974 19.3137 9.62598 17.6921 9.62598 16.0013Z"
21
+ fill="white"
22
+ class="block dark:hidden"
23
+ />
24
+ <path
25
+ d="M16.0006 25.9992C13.8266 25.999 11.7118 25.2901 9.97686 23.9799C8.2419 22.6698 6.98127 20.8298 6.38599 18.7388C5.79071 16.6478 5.89323 14.4198 6.678 12.3923C7.46278 10.3648 8.88705 8.64837 10.735 7.50308C12.5829 6.35779 14.7538 5.84606 16.9187 6.04544C19.0837 6.24481 21.1246 7.14442 22.7323 8.60795C24.34 10.0715 25.4268 12.0192 25.8281 14.1559C26.2293 16.2926 25.9232 18.5019 24.9561 20.449C24.7703 20.8042 24.7223 21.2155 24.8211 21.604L25.4211 23.8316C25.4803 24.0518 25.4805 24.2837 25.4216 24.5039C25.3627 24.7242 25.2468 24.925 25.0856 25.0862C24.9244 25.2474 24.7235 25.3633 24.5033 25.4222C24.283 25.4811 24.0512 25.4809 23.831 25.4217L21.6034 24.8217C21.2172 24.7248 20.809 24.7729 20.4558 24.9567C19.0683 25.6467 17.5457 26.0068 16.0006 26.0068V25.9992Z"
26
+ fill="white"
27
+ class="hidden dark:block"
28
+ />
29
+ <path
30
+ d="M9.62598 16.0013C9.62598 15.3799 10.1294 14.8765 10.7508 14.8765C11.3721 14.8765 11.8756 15.3799 11.8756 16.0013C11.8756 17.0953 12.3102 18.1448 13.0838 18.9184C13.8574 19.692 14.9069 20.1266 16.001 20.1267C17.095 20.1267 18.1445 19.692 18.9181 18.9184C19.6918 18.1448 20.1264 17.0953 20.1264 16.0013C20.1264 15.3799 20.6299 14.8765 21.2512 14.8765C21.8725 14.8765 22.3759 15.3799 22.3759 16.0013C22.3759 17.6921 21.7046 19.3137 20.509 20.5093C19.3134 21.7049 17.6918 22.3762 16.001 22.3762C14.3102 22.3762 12.6885 21.7049 11.4929 20.5093C10.2974 19.3137 9.62598 17.6921 9.62598 16.0013Z"
31
+ fill="black"
32
+ class="hidden dark:block"
33
+ />
34
+ </svg>
35
+
36
+ <style>
37
+ .icon-size {
38
+ width: 0.75rem;
39
+ height: 0.75rem;
40
+ }
41
+
42
+ @media (max-width: 640px) {
43
+ .icon-size {
44
+ width: 0.625rem;
45
+ height: 0.625rem;
46
+ }
47
+ }
48
+
49
+ .menu-icon {
50
+ width: 1rem;
51
+ height: 1rem;
52
+ flex-shrink: 0;
53
+ }
54
+
55
+ .hidden {
56
+ display: none;
57
+ }
58
+
59
+ .block {
60
+ display: block;
61
+ }
62
+ </style>
@@ -3,18 +3,19 @@
3
3
  import CopyButton from "./CopyButton.svelte";
4
4
  import { Tool, Prompt, Resource } from "@gradio/icons";
5
5
  import { format_latency, get_color_from_success_rate } from "./utils";
6
+ import PercentileChart from "./PercentileChart.svelte";
6
7
 
7
8
  export let mcp_server_active: boolean;
8
- export let mcp_server_url: string;
9
9
  export let mcp_server_url_streamable: string;
10
+ export let root: string;
10
11
  export let tools: Tool[];
11
12
  export let all_tools: Tool[] = [];
12
13
  export let selected_tools: Set<string> = new Set();
13
- export let mcp_json_sse: any;
14
14
  export let mcp_json_stdio: any;
15
15
  export let file_data_present: boolean;
16
16
  export let mcp_docs: string;
17
17
  export let analytics: Record<string, any>;
18
+ export let config_snippets: Record<string, string>;
18
19
 
19
20
  interface ToolParameter {
20
21
  title?: string;
@@ -36,13 +37,12 @@
36
37
  };
37
38
  }
38
39
 
39
- type Transport = "streamable_http" | "sse" | "stdio";
40
+ type Transport = "streamable_http" | "stdio";
40
41
  let current_transport: Transport = "streamable_http";
41
42
  let include_file_upload = true;
42
43
 
43
44
  const transports = [
44
45
  ["streamable_http", "Streamable HTTP"],
45
- ["sse", "SSE"],
46
46
  ["stdio", "STDIO"]
47
47
  ] as const;
48
48
 
@@ -52,8 +52,7 @@
52
52
  prompt: Prompt
53
53
  };
54
54
 
55
- $: display_url =
56
- current_transport === "sse" ? mcp_server_url : mcp_server_url_streamable;
55
+ $: display_url = mcp_server_url_streamable;
57
56
 
58
57
  // Helper function to add/remove file upload tool from config
59
58
  function update_config_with_file_upload(
@@ -72,9 +71,7 @@
72
71
  "gradio[mcp]",
73
72
  "gradio",
74
73
  "upload-mcp",
75
- current_transport === "sse"
76
- ? mcp_server_url
77
- : mcp_server_url_streamable,
74
+ root,
78
75
  "<UPLOAD_DIRECTORY>"
79
76
  ]
80
77
  };
@@ -87,13 +84,10 @@
87
84
  }
88
85
 
89
86
  $: mcp_json_streamable_http = update_config_with_file_upload(
90
- mcp_json_sse
87
+ mcp_json_stdio
91
88
  ? {
92
- ...mcp_json_sse,
93
89
  mcpServers: {
94
- ...mcp_json_sse.mcpServers,
95
90
  gradio: {
96
- ...mcp_json_sse.mcpServers.gradio,
97
91
  url: mcp_server_url_streamable
98
92
  }
99
93
  }
@@ -102,14 +96,15 @@
102
96
  include_file_upload
103
97
  );
104
98
 
105
- $: mcp_json_sse_updated = update_config_with_file_upload(
106
- mcp_json_sse,
107
- include_file_upload
108
- );
109
99
  $: mcp_json_stdio_updated = update_config_with_file_upload(
110
100
  mcp_json_stdio,
111
101
  include_file_upload
112
102
  );
103
+
104
+ $: config_snippets = {
105
+ streamable_http: JSON.stringify(mcp_json_streamable_http, null, 2),
106
+ stdio: JSON.stringify(mcp_json_stdio_updated, null, 2)
107
+ };
113
108
  </script>
114
109
 
115
110
  {#if mcp_server_active}
@@ -134,10 +129,8 @@
134
129
  <Block>
135
130
  <div class="mcp-url">
136
131
  <label for="mcp-server-url"
137
- ><span class="status-indicator active">●</span>MCP Server URL ({current_transport ===
138
- "sse"
139
- ? "SSE"
140
- : "Streamable HTTP"})</label
132
+ ><span class="status-indicator active">●</span>MCP Server URL
133
+ (Streamable HTTP)</label
141
134
  >
142
135
  <div class="textbox">
143
136
  <input id="mcp-server-url" type="text" readonly value={display_url} />
@@ -227,34 +220,19 @@
227
220
  : "⚠︎ No description provided in function docstring"}
228
221
  </span>
229
222
  {#if analytics[tool.meta.endpoint_name]}
230
- <span
231
- class="tool-analytics"
232
- style="color: var(--body-text-color-subdued); margin-left: 1em;"
233
- >
234
- Total requests: {analytics[tool.meta.endpoint_name]
235
- .total_requests}
236
- <span style={color}
237
- >({Math.round(success_rate * 100)}% successful)</span
223
+ {@const endpoint_analytics = analytics[tool.meta.endpoint_name]}
224
+ {@const p50 =
225
+ endpoint_analytics.process_time_percentiles["50th"]}
226
+ <div class="tool-analytics-wrapper" style="margin-left: 1em;">
227
+ <span
228
+ class="tool-analytics"
229
+ style="color: var(--body-text-color-subdued);"
238
230
  >
239
- &nbsp;|&nbsp; p50/p90/p99:
240
- {format_latency(
241
- analytics[tool.meta.endpoint_name].process_time_percentiles[
242
- "50th"
243
- ]
244
- )}
245
- /
246
- {format_latency(
247
- analytics[tool.meta.endpoint_name].process_time_percentiles[
248
- "90th"
249
- ]
250
- )}
251
- /
252
- {format_latency(
253
- analytics[tool.meta.endpoint_name].process_time_percentiles[
254
- "99th"
255
- ]
256
- )}
257
- </span>
231
+ {endpoint_analytics.total_requests} requests ({Math.round(
232
+ success_rate * 100
233
+ )}% successful, p50: {format_latency(p50)})
234
+ </span>
235
+ </div>
258
236
  {/if}
259
237
  </span>
260
238
  <span class="tool-arrow">{tool.expanded ? "▼" : "▶"}</span>
@@ -290,7 +268,7 @@
290
268
  </div>
291
269
  <p>&nbsp;</p>
292
270
 
293
- {#if current_transport === "streamable_http"}
271
+ <div class:hidden={current_transport !== "streamable_http"}>
294
272
  <strong>Streamable HTTP Transport</strong>: To add this MCP to clients that
295
273
  support Streamable HTTP, simply add the following configuration to your MCP
296
274
  config.
@@ -298,32 +276,15 @@
298
276
  <Block>
299
277
  <code>
300
278
  <div class="copy">
301
- <CopyButton
302
- code={JSON.stringify(mcp_json_streamable_http, null, 2)}
303
- />
279
+ <CopyButton code={config_snippets.streamable_http} />
304
280
  </div>
305
281
  <div>
306
- <pre>{JSON.stringify(mcp_json_streamable_http, null, 2)}</pre>
282
+ <pre>{config_snippets.streamable_http}</pre>
307
283
  </div>
308
284
  </code>
309
285
  </Block>
310
- {:else if current_transport === "sse"}
311
- <strong>SSE Transport</strong>: The SSE transport has been deprecated by the
312
- MCP spec. We recommend using the Streamable HTTP transport instead. But to
313
- add this MCP to clients that only support server-sent events (SSE), simply
314
- add the following configuration to your MCP config.
315
- <p>&nbsp;</p>
316
- <Block>
317
- <code>
318
- <div class="copy">
319
- <CopyButton code={JSON.stringify(mcp_json_sse_updated, null, 2)} />
320
- </div>
321
- <div>
322
- <pre>{JSON.stringify(mcp_json_sse_updated, null, 2)}</pre>
323
- </div>
324
- </code>
325
- </Block>
326
- {:else if current_transport === "stdio"}
286
+ </div>
287
+ <div class:hidden={current_transport !== "stdio"}>
327
288
  <strong>STDIO Transport</strong>: For clients that only support stdio (e.g.
328
289
  Claude Desktop), first
329
290
  <a href="https://nodejs.org/en/download/" target="_blank">install Node.js</a
@@ -332,14 +293,14 @@
332
293
  <Block>
333
294
  <code>
334
295
  <div class="copy">
335
- <CopyButton code={JSON.stringify(mcp_json_stdio_updated, null, 2)} />
296
+ <CopyButton code={config_snippets.stdio} />
336
297
  </div>
337
298
  <div>
338
- <pre>{JSON.stringify(mcp_json_stdio_updated, null, 2)}</pre>
299
+ <pre>{config_snippets.stdio}</pre>
339
300
  </div>
340
301
  </code>
341
302
  </Block>
342
- {/if}
303
+ </div>
343
304
  {#if file_data_present}
344
305
  <div class="file-upload-section">
345
306
  <label class="checkbox-label">
@@ -380,10 +341,16 @@
380
341
  {/if}
381
342
 
382
343
  <style>
344
+ .tool-analytics-wrapper {
345
+ position: relative;
346
+ display: inline-block;
347
+ }
348
+
383
349
  .tool-analytics {
384
350
  font-size: 0.95em;
385
351
  color: var(--body-text-color-subdued);
386
352
  }
353
+
387
354
  .transport-selection {
388
355
  margin-bottom: var(--size-4);
389
356
  }
@@ -665,4 +632,8 @@
665
632
  a {
666
633
  text-decoration: underline;
667
634
  }
635
+
636
+ .hidden {
637
+ display: none;
638
+ }
668
639
  </style>
@@ -5,7 +5,7 @@
5
5
  export let is_running: boolean;
6
6
  export let endpoint_returns: any;
7
7
  export let js_returns: any;
8
- export let current_language: "python" | "javascript" | "bash";
8
+ export let current_language: "python" | "javascript" | "bash" | "mcp";
9
9
  </script>
10
10
 
11
11
  <h4>
@@ -0,0 +1,125 @@
1
+ <script lang="ts">
2
+ import { format_latency } from "./utils";
3
+
4
+ export let p50: number;
5
+ export let p90: number;
6
+ export let p99: number;
7
+
8
+ $: max_latency = Math.max(p50, p90, p99);
9
+ </script>
10
+
11
+ <div class="tooltip-chart">
12
+ <div class="tooltip-arrow"></div>
13
+ <div class="chart-bars">
14
+ <div class="chart-bar-container">
15
+ <div class="chart-bar-label">p50</div>
16
+ <div class="chart-bar-wrapper">
17
+ <div
18
+ class="chart-bar"
19
+ style="width: {(p50 / max_latency) * 100}%"
20
+ ></div>
21
+ </div>
22
+ <div class="chart-bar-value">{format_latency(p50)}</div>
23
+ </div>
24
+ <div class="chart-bar-container">
25
+ <div class="chart-bar-label">p90</div>
26
+ <div class="chart-bar-wrapper">
27
+ <div
28
+ class="chart-bar"
29
+ style="width: {(p90 / max_latency) * 100}%"
30
+ ></div>
31
+ </div>
32
+ <div class="chart-bar-value">{format_latency(p90)}</div>
33
+ </div>
34
+ <div class="chart-bar-container">
35
+ <div class="chart-bar-label">p99</div>
36
+ <div class="chart-bar-wrapper">
37
+ <div
38
+ class="chart-bar"
39
+ style="width: {(p99 / max_latency) * 100}%"
40
+ ></div>
41
+ </div>
42
+ <div class="chart-bar-value">{format_latency(p99)}</div>
43
+ </div>
44
+ </div>
45
+ </div>
46
+
47
+ <style>
48
+ .tooltip-chart {
49
+ background: var(--background-fill-primary);
50
+ border: 1px solid var(--border-color-primary);
51
+ border-radius: var(--radius-md);
52
+ padding: var(--size-3);
53
+ box-shadow: var(--shadow-drop-lg);
54
+ min-width: 200px;
55
+ position: relative;
56
+ }
57
+
58
+ .tooltip-arrow {
59
+ position: absolute;
60
+ bottom: -8px;
61
+ left: 50%;
62
+ transform: translateX(-50%);
63
+ width: 0;
64
+ height: 0;
65
+ border-left: 8px solid transparent;
66
+ border-right: 8px solid transparent;
67
+ border-top: 8px solid var(--border-color-primary);
68
+ }
69
+
70
+ .tooltip-arrow::after {
71
+ content: "";
72
+ position: absolute;
73
+ bottom: 1px;
74
+ left: 50%;
75
+ transform: translateX(-50%);
76
+ width: 0;
77
+ height: 0;
78
+ border-left: 7px solid transparent;
79
+ border-right: 7px solid transparent;
80
+ border-top: 7px solid var(--background-fill-primary);
81
+ }
82
+
83
+ .chart-bars {
84
+ display: flex;
85
+ flex-direction: column;
86
+ gap: var(--size-2);
87
+ }
88
+
89
+ .chart-bar-container {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: var(--size-2);
93
+ }
94
+
95
+ .chart-bar-label {
96
+ font-size: var(--text-sm);
97
+ font-weight: var(--weight-semibold);
98
+ color: var(--body-text-color);
99
+ min-width: 30px;
100
+ }
101
+
102
+ .chart-bar-wrapper {
103
+ flex: 1;
104
+ height: 16px;
105
+ background: var(--background-fill-secondary);
106
+ border-radius: var(--radius-sm);
107
+ overflow: hidden;
108
+ position: relative;
109
+ }
110
+
111
+ .chart-bar {
112
+ height: 100%;
113
+ background: var(--color-accent);
114
+ border-radius: var(--radius-sm);
115
+ transition: width 0.3s ease;
116
+ }
117
+
118
+ .chart-bar-value {
119
+ font-size: var(--text-sm);
120
+ color: var(--body-text-color);
121
+ min-width: 50px;
122
+ text-align: right;
123
+ font-family: var(--font-mono);
124
+ }
125
+ </style>
@@ -4,7 +4,7 @@
4
4
  export let is_running: boolean;
5
5
  export let endpoint_returns: any;
6
6
  export let js_returns: any;
7
- export let current_language: "python" | "javascript" | "bash";
7
+ export let current_language: "python" | "javascript" | "bash" | "mcp";
8
8
  </script>
9
9
 
10
10
  <h4>
@@ -2,17 +2,21 @@
2
2
  /* eslint-disable */
3
3
  import { onMount } from "svelte";
4
4
  import SettingsBanner from "./SettingsBanner.svelte";
5
- export let root: string;
6
- export let space_id: string | null;
7
- export let pwa_enabled: boolean | undefined;
8
5
  import { BaseDropdown as Dropdown } from "@gradio/dropdown";
9
6
  import { BaseCheckbox as Checkbox } from "@gradio/checkbox";
10
7
  import { language_choices, changeLocale } from "../i18n";
11
8
  import { locale, _ } from "svelte-i18n";
12
- import { setupi18n } from "../i18n";
13
9
  import record from "./img/record.svg";
14
10
  import { createEventDispatcher } from "svelte";
15
11
 
12
+ let {
13
+ root,
14
+ space_id,
15
+ pwa_enabled,
16
+ allow_zoom = $bindable(),
17
+ allow_video_trim = $bindable()
18
+ } = $props();
19
+
16
20
  const dispatch = createEventDispatcher();
17
21
  if (root === "") {
18
22
  root = location.protocol + "//" + location.host + location.pathname;
@@ -34,7 +38,7 @@
34
38
  }
35
39
 
36
40
  onMount(() => {
37
- document.body.style.overflow = "hidden";
41
+ // document.body.style.overflow = "hidden";
38
42
  if ("parentIFrame" in window) {
39
43
  window.parentIFrame?.scrollTo(0, 0);
40
44
  }
@@ -46,10 +50,8 @@
46
50
  };
47
51
  });
48
52
 
49
- let current_locale: string;
50
- let current_theme: "light" | "dark" | "system" = "system";
51
- export let allow_zoom = true;
52
- export let allow_video_trim = true;
53
+ let current_locale: string = $state("en");
54
+ let current_theme: "light" | "dark" | "system" = $state("system");
53
55
 
54
56
  locale.subscribe((value) => {
55
57
  if (value) {
@@ -69,8 +71,6 @@
69
71
  function handleVideoTrimChange(e: CustomEvent): void {
70
72
  allow_video_trim = e.detail;
71
73
  }
72
-
73
- setupi18n();
74
74
  </script>
75
75
 
76
76
  <div class="banner-wrap">