const We = "host", Te = "queue/data", Ze = "queue/join", ye = "upload", Ke = "login", K = "config", Ve = "info", Ye = "runtime", Qe = "sleeptime", Xe = "heartbeat", et = "component_server", tt = "reset", st = "cancel", nt = "app_id", Ae = "This application is currently busy. Please try again. ", M = "Connection errored out. ", D = "Could not resolve app config. ", it = "Could not get space status. ", ot = "Could not get API info. ", ue = "Space metadata could not be loaded. ", rt = "Invalid URL. A full URL path is required.", at = "Not authorized to access this space. ", xe = "Invalid credentials. Could not login. ", ct = "Login credentials are required to access this space.", ut = "File system access is only available in Node.js environments", Ce = "Root URL not found in client config", lt = "Error uploading file"; async function be(e, s, t) { try { return (await (await fetch(`https://huggingface.co/api/spaces/${e}/jwt`, { headers: { Authorization: `Bearer ${s}`, ...t ? { Cookie: t } : {} } })).json()).token || !1; } catch { return !1; } } function pt(e) { let s = {}; return e.forEach(({ api_name: t, id: n }) => { t && (s[t] = n); }), s; } async function dt(e) { const s = this.options.token ? { Authorization: `Bearer ${this.options.token}` } : {}; if (s["Content-Type"] = "application/json", typeof window < "u" && window.gradio_config && location.origin !== "http://localhost:9876") { if (window.gradio_config.current_page && (e = e.substring(0, e.lastIndexOf("/"))), window.gradio_config.dev_mode || typeof window < "u" && window?.BUILD_MODE === "dev") { let t = ae( e, this.deep_link ? K + "?deep_link=" + this.deep_link : K ); const n = await this.fetch(t, { headers: s, credentials: "include" }), i = await ve(n, !!this.options.auth); i.root = e || i.root, window.gradio_config = { ...i, current_page: window.gradio_config.current_page }; } return { ...window.gradio_config }; } else if (e) { let t = ae( e, this.deep_link ? K + "?deep_link=" + this.deep_link : K ); const n = await this.fetch(t, { headers: s, credentials: "include" }), i = await ve(n, !!this.options.auth); return i.root || (i.root = e), i; } throw new Error(D); } async function ve(e, s) { if (e?.status === 401 && !s) { const n = (await e.json())?.detail?.auth_message; throw new Error(n || ct); } else if (e?.status === 401 && s) throw new Error(xe); if (e?.status === 200) { let t = await e.json(); return t.dependencies?.forEach((n, i) => { n.id === void 0 && (n.id = i); }), t; } else if (e?.status === 401) throw new Error(at); throw new Error(D); } async function ht() { const { http_protocol: e, host: s } = await pe( this.app_reference, this.options.token ); try { if (this.options.auth) { const t = await De( e, s, this.options.auth, this.fetch, this.options.token ); t && this.set_cookies(t); } } catch (t) { throw Error(t.message); } } async function De(e, s, t, n, i) { const r = new FormData(); r.append("username", t?.[0]), r.append("password", t?.[1]); let o = {}; i && (o.Authorization = `Bearer ${i}`); const a = await n(`${e}//${s}/${Ke}`, { headers: o, method: "POST", body: r, credentials: "include" }); if (a.status === 200) return a.headers.get("set-cookie"); throw a.status === 401 ? new Error(xe) : new Error(ue); } function re(e) { if (e.startsWith("http")) { const { protocol: s, host: t, pathname: n } = new URL(e); return { ws_protocol: s === "https:" ? "wss" : "ws", http_protocol: s, host: t + (n !== "/" ? n : "") }; } return { ws_protocol: "wss", http_protocol: "https:", host: new URL(e).host }; } const Ne = (e) => { let s = []; return e.split(/,(?=\s*[^\s=;]+=[^\s=;]+)/).forEach((n) => { const [i, r] = n.split(";")[0].split("="); i && r && s.push(`${i.trim()}=${r.trim()}`); }), s; }, le = /^[a-zA-Z0-9_\-\.]+\/[a-zA-Z0-9_\-\.]+$/, ft = /.*hf\.space\/{0,1}.*$/; async function pe(e, s) { const t = {}; s && (t.Authorization = `Bearer ${s}`); const n = e.trim().replace(/\/$/, ""); if (le.test(n)) try { const r = (await (await fetch( `https://huggingface.co/api/spaces/${n}/${We}`, { headers: t } )).json()).host; return { space_id: e, ...re(r) }; } catch { throw new Error(ue); } if (ft.test(n)) { const { ws_protocol: i, http_protocol: r, host: o } = re(n); return { space_id: o.split("/")[0].replace(".hf.space", ""), ws_protocol: i, http_protocol: r, host: o }; } return { space_id: !1, ...re(n) }; } const ae = (...e) => { try { return e.reduce((s, t) => (s = s.replace(/\/+$/, ""), t = t.replace(/^\/+/, ""), new URL(t, s + "/").toString())); } catch { throw new Error(rt); } }; function _t(e, s, t) { const n = { named_endpoints: {}, unnamed_endpoints: {} }; return Object.keys(e).forEach((i) => { (i === "named_endpoints" || i === "unnamed_endpoints") && (n[i] = {}, Object.entries(e[i]).forEach( ([r, { parameters: o, returns: a }]) => { const u = s.dependencies.find( (c) => c.api_name === r || c.api_name === r.replace("/", "") )?.id || t[r.replace("/", "")] || -1, l = u !== -1 ? s.dependencies.find((c) => c.id == u)?.types : { generator: !1, cancel: !1 }; if (u !== -1 && s.dependencies.find((c) => c.id == u)?.inputs?.length !== o.length) { const c = s.dependencies.find((m) => m.id == u).inputs.map( (m) => s.components.find((w) => w.id === m)?.type ); try { c.forEach((m, w) => { if (m === "state") { const N = { component: "state", example: null, parameter_default: null, parameter_has_default: !0, parameter_name: null, hidden: !0 }; o.splice(w, 0, N); } }); } catch (m) { console.error(m); } } const p = (c, m, w, N) => ({ ...c, description: gt(c?.type, w), type: mt(c?.type, m, w, N) || "" }); n[i][r] = { parameters: o.map( (c) => p(c, c?.component, c?.serializer, "parameter") ), returns: a.map( (c) => p(c, c?.component, c?.serializer, "return") ), type: l }; } )); }), n; } function mt(e, s, t, n) { if (s === "Api") return e.type; switch (e?.type) { case "string": return "string"; case "boolean": return "boolean"; case "number": return "number"; } if (t === "JSONSerializable" || t === "StringSerializable") return "any"; if (t === "ListStringSerializable") return "string[]"; if (s === "Image") return n === "parameter" ? "Blob | File | Buffer" : "string"; if (t === "FileSerializable") return e?.type === "array" ? n === "parameter" ? "(Blob | File | Buffer)[]" : "{ name: string; data: string; size?: number; is_file?: boolean; orig_name?: string}[]" : n === "parameter" ? "Blob | File | Buffer" : "{ name: string; data: string; size?: number; is_file?: boolean; orig_name?: string}"; if (t === "GallerySerializable") return n === "parameter" ? "[(Blob | File | Buffer), (string | null)][]" : "[{ name: string; data: string; size?: number; is_file?: boolean; orig_name?: string}, (string | null))][]"; } function gt(e, s) { return s === "GallerySerializable" ? "array of [file, label] tuples" : s === "ListStringSerializable" ? "array of strings" : s === "FileSerializable" ? "array of files or single file" : e?.description; } function Ee(e, s) { switch (e.msg) { case "send_data": return { type: "data" }; case "send_hash": return { type: "hash" }; case "queue_full": return { type: "update", status: { queue: !0, message: Ae, stage: "error", code: e.code, success: e.success } }; case "heartbeat": return { type: "heartbeat" }; case "unexpected_error": return { type: "unexpected_error", status: { queue: !0, message: e.message, session_not_found: e.session_not_found, stage: "error", success: !1 } }; case "broken_connection": return { type: "broken_connection", status: { queue: !0, message: e.message, stage: "error", success: !1 } }; case "estimation": return { type: "update", status: { queue: !0, stage: s || "pending", code: e.code, size: e.queue_size, position: e.rank, eta: e.rank_eta, success: e.success } }; case "progress": return { type: "update", status: { queue: !0, stage: "pending", code: e.code, progress_data: e.progress_data, success: e.success } }; case "log": return { type: "log", data: e }; case "process_generating": return { type: "generating", status: { queue: !0, message: e.success ? null : e.output.error, stage: e.success ? "generating" : "error", code: e.code, progress_data: e.progress_data, eta: e.average_duration, changed_state_ids: e.success ? e.output.changed_state_ids : void 0 }, data: e.success ? e.output : null }; case "process_streaming": return { type: "streaming", status: { queue: !0, message: e.output.error, stage: "streaming", time_limit: e.time_limit, code: e.code, progress_data: e.progress_data, eta: e.eta }, data: e.output }; case "process_completed": return "error" in e.output ? { type: "update", status: { queue: !0, title: e.output.title ?? "Error", message: e.output.error ?? "An error occurred", visible: e.output.visible, duration: e.output.duration, stage: "error", code: e.code, success: e.success } } : { type: "complete", status: { queue: !0, message: e.success ? void 0 : e.output.error, stage: e.success ? "complete" : "error", code: e.code, progress_data: e.progress_data, changed_state_ids: e.success ? e.output.changed_state_ids : void 0 }, data: e.success ? e.output : null }; case "process_starts": return { type: "update", status: { queue: !0, stage: "pending", code: e.code, size: e.rank, position: 0, success: e.success, eta: e.eta }, original_msg: "process_starts" }; } return { type: "none", status: { stage: "error", queue: !0 } }; } const wt = (e = [], s) => { const t = s ? s.parameters : []; if (Array.isArray(e)) return s && t.length > 0 && e.length > t.length && console.warn("Too many arguments provided for the endpoint."), e; const n = [], i = Object.keys(e); return t.forEach((r, o) => { if (e.hasOwnProperty(r.parameter_name)) n[o] = e[r.parameter_name]; else if (r.parameter_has_default) n[o] = r.parameter_default; else throw new Error( `No value provided for required parameter: ${r.parameter_name}` ); }), i.forEach((r) => { if (!t.some((o) => o.parameter_name === r)) throw new Error( `Parameter \`${r}\` is not a valid keyword argument. Please refer to the API for usage.` ); }), n.forEach((r, o) => { if (r === void 0 && !t[o].parameter_has_default) throw new Error( `No value provided for required parameter: ${t[o].parameter_name}` ); }), n; }; async function yt() { if (this.api_info) return this.api_info; const { token: e } = this.options, { config: s } = this, t = { "Content-Type": "application/json" }; if (e && (t.Authorization = `Bearer ${e}`), !!s) try { let n, i; if (typeof window < "u" && window.gradio_api_info) i = window.gradio_api_info; else { const r = ae(s.root, this.api_prefix, Ve); if (n = await this.fetch(r, { headers: t, credentials: "include" }), !n.ok) throw new Error(M); i = await n.json(); } return "api" in i && (i = i.api), i.named_endpoints["/predict"] && !i.unnamed_endpoints[0] && (i.unnamed_endpoints[0] = i.named_endpoints["/predict"]), _t(i, s, this.api_map); } catch (n) { throw new Error("Could not get API info. " + n.message); } } async function bt(e, s, t) { const n = {}; this?.options?.token && (n.Authorization = `Bearer ${this.options.token}`); const i = 1e3, r = []; let o; for (let a = 0; a < s.length; a += i) { const u = s.slice(a, a + i), l = new FormData(); u.forEach((c) => { l.append("files", c); }); try { const c = t ? `${e}${this.api_prefix}/${ye}?upload_id=${t}` : `${e}${this.api_prefix}/${ye}`; o = await this.fetch(c, { method: "POST", body: l, headers: n, credentials: "include" }); } catch (c) { throw new Error(M + c.message); } if (!o.ok) { const c = await o.text(); return { error: `HTTP ${o.status}: ${c}` }; } const p = await o.json(); p && r.push(...p); } return { files: r }; } const vt = { radix: 1e3, unit: ["b", "kb", "Mb", "Gb", "Tb", "Pb", "Eb", "Zb", "Yb"] }, Et = { radix: 1024, unit: ["b", "Kib", "Mib", "Gib", "Tib", "Pib", "Eib", "Zib", "Yib"] }, St = { radix: 1024, unit: ["b", "Kb", "Mb", "Gb", "Tb", "Pb", "Eb", "Zb", "Yb"] }, Se = { si: vt, iec: Et, jedec: St }; function $t(e, s = 1, t = "jedec") { e = Math.abs(e); const { radix: n, unit: i } = Se[t] || Se.jedec; let r = 0; for (; e >= n; ) e /= n, ++r; return `${e.toFixed(s)} ${i[r]}`; } async function kt(e, s, t, n) { let i = (Array.isArray(e) ? e : [e]).map( (o) => o.blob ); const r = i.filter( (o) => o.size > (n ?? 1 / 0) ); if (r.length) throw new Error( `File(s) exceed the maximum allowed size of ${$t(n || 1 / 0)}: ${r.map((o) => `"${o.name}"`).join(", ")}` ); return await Promise.all( await this.upload_files(s, i, t).then( async (o) => { if (o.error) throw new Error(o.error); return o.files ? o.files.map((a, u) => new Q({ ...e[u], path: a, url: `${s}${this.api_prefix}/file=${a}` })) : []; } ) ); } async function Xt(e, s) { return e.map( (t) => new Q({ path: t.name, orig_name: t.name, blob: t, size: t.size, mime_type: t.type, is_stream: s }) ); } class Q { path; url; orig_name; size; blob; is_stream; mime_type; alt_text; b64; meta = { _type: "gradio.FileData" }; constructor({ path: s, url: t, orig_name: n, size: i, blob: r, is_stream: o, mime_type: a, alt_text: u, b64: l }) { this.path = s, this.url = t, this.orig_name = n, this.size = i, this.blob = t ? void 0 : r, this.is_stream = o, this.mime_type = a, this.alt_text = u, this.b64 = l; } } class Le { type; command; meta; fileData; constructor(s, t) { this.type = "command", this.command = s, this.meta = t; } } const Rt = typeof process < "u" && process.versions && process.versions.node; function $e(e, s, t) { for (; t.length > 1; ) { const i = t.shift(); if (typeof i == "string" || typeof i == "number") e = e[i]; else throw new Error("Invalid key type"); } const n = t.shift(); if (typeof n == "string" || typeof n == "number") e[n] = s; else throw new Error("Invalid key type"); } async function ce(e, s = void 0, t = [], n = !1, i = void 0) { if (Array.isArray(e)) { let r = []; return await Promise.all( e.map(async (o, a) => { let u = t.slice(); u.push(String(a)); const l = await ce( e[a], n ? i?.parameters[a]?.component || void 0 : s, u, !1, i ); r = r.concat(l); }) ), r; } else { if (globalThis.Buffer && e instanceof globalThis.Buffer || e instanceof Blob) return [ { path: t, blob: new Blob([e]), type: s } ]; if (typeof e == "object" && e !== null) { let r = []; for (const o of Object.keys(e)) { const a = [...t, o], u = e[o]; r = r.concat( await ce( u, void 0, a, !1, i ) ); } return r; } } return []; } function Ot(e, s) { let t = s?.dependencies?.find((n) => n.id == e)?.queue; return t != null ? !t : !s.enable_queue; } function Tt(e, s) { return new Promise((t, n) => { const i = new MessageChannel(); i.port1.onmessage = (({ data: r }) => { i.port1.close(), t(r); }), window.parent.postMessage(e, s, [i.port2]); }); } function es(e) { if (typeof e == "string") { if (e.startsWith("http://") || e.startsWith("https://")) return { path: e, url: e, orig_name: e.split("/").pop() ?? "unknown", meta: { _type: "gradio.FileData" } }; if (Rt) return new Le("upload_file", { path: e, name: e, orig_path: e }); } else { if (typeof File < "u" && e instanceof File) return new Blob([e]); if (e instanceof Buffer) return new Blob([e]); if (e instanceof Blob) return e; } throw new Error( "Invalid input: must be a URL, File, Blob, or Buffer object." ); } function V(e, s, t, n, i = !1) { if (n === "input" && !i) throw new Error("Invalid code path. Cannot skip state inputs for input."); if (n === "output" && i) return e; let r = [], o = 0; const a = n === "input" ? s.inputs : s.outputs; for (let u = 0; u < a.length; u++) { const l = a[u]; if (t.find((c) => c.id === l)?.type === "state") { if (i) if (e.length === a.length) { const c = e[o]; r.push(c), o++; } else r.push(null); else { o++; continue; } continue; } else { const c = e[o]; r.push(c), o++; } } return r; } async function At(e, s, t) { const n = this; await xt(n, s); const i = await ce( s, void 0, [], !0, t ); return (await Promise.all( i.map(async ({ path: o, blob: a, type: u }) => { if (!a) return { path: o, type: u }; const l = await n.upload_files(e, [a]), p = l.files && l.files[0]; return { path: o, file_url: p, type: u, name: typeof File < "u" && a instanceof File ? a?.name : void 0 }; }) )).forEach(({ path: o, file_url: a, type: u, name: l }) => { if (u === "Gallery") $e(s, a, o); else if (a) { const p = new Q({ path: a, orig_name: l }); $e(s, p, o); } }), s; } async function xt(e, s) { if (!(e.config?.root || e.config?.root_url)) throw new Error(Ce); await Pe(e, s); } async function Pe(e, s, t = []) { for (const n in s) s[n] instanceof Le ? await Ct(e, s, n) : typeof s[n] == "object" && s[n] !== null && await Pe(e, s[n], [...t, n]); } async function Ct(e, s, t) { let n = s[t]; const i = e.config?.root || e.config?.root_url; if (!i) throw new Error(Ce); try { let r, o; if (typeof process < "u" && process.versions && process.versions.node) { const p = await import("./__vite-browser-external-DYxpcVy9.js"); o = (await import("./__vite-browser-external-DYxpcVy9.js")).resolve(process.cwd(), n.meta.path), r = await p.readFile(o); } else throw new Error(ut); const a = new Blob([r], { type: "application/octet-stream" }), u = await e.upload_files(i, [a]), l = u.files && u.files[0]; if (l) { const p = new Q({ path: l, orig_name: n.meta.name || "" }); s[t] = p; } } catch (r) { console.error(lt, r); } } async function Dt(e, s, t) { const n = { "Content-Type": "application/json" }; this.options.token && (n.Authorization = `Bearer ${this.options.token}`); try { var i = await this.fetch(e, { method: "POST", body: JSON.stringify(s), headers: { ...n, ...t }, credentials: "include" }); } catch { return [{ error: M }, 500]; } let r, o; try { r = await i.json(), o = i.status; } catch (a) { r = { error: `Could not parse server response: ${a}` }, o = 500; } return [r, o]; } async function Nt(e, s = {}) { let t = !1, n = !1; if (!this.config) throw new Error("Could not resolve app config"); if (typeof e == "number") this.config.dependencies.find((i) => i.id == e); else { const i = e.replace(/^\//, ""); this.config.dependencies.find( (r) => r.id == this.api_map[i] ); } return new Promise(async (i, r) => { const o = this.submit(e, s, null, null, !0); let a; for await (const u of o) u.type === "data" && (n && i(a), t = !0, a = u), u.type === "status" && (u.stage === "error" && r(u), u.stage === "complete" && (n = !0, t && i(a))); }); } async function G(e, s, t) { let n = s === "subdomain" ? `https://huggingface.co/api/spaces/by-subdomain/${e}` : `https://huggingface.co/api/spaces/${e}`, i, r; try { if (i = await fetch(n), r = i.status, r !== 200) throw new Error(); i = await i.json(); } catch { t({ status: "error", load_status: "error", message: it, detail: "NOT_FOUND" }); return; } if (!i || r !== 200) return; const { runtime: { stage: o }, id: a } = i; switch (o) { case "STOPPED": case "SLEEPING": t({ status: "sleeping", load_status: "pending", message: "Space is asleep. Waking it up...", detail: o }), setTimeout(() => { G(e, s, t); }, 1e3); break; case "PAUSED": t({ status: "paused", load_status: "error", message: "This space has been paused by the author. If you would like to try this demo, consider duplicating the space.", detail: o, discussions_enabled: await ke(a) }); break; case "RUNNING": case "RUNNING_BUILDING": t({ status: "running", load_status: "complete", message: "Space is running.", detail: o }); break; case "BUILDING": t({ status: "building", load_status: "pending", message: "Space is building...", detail: o }), setTimeout(() => { G(e, s, t); }, 1e3); break; case "APP_STARTING": t({ status: "starting", load_status: "pending", message: "Space is starting...", detail: o }), setTimeout(() => { G(e, s, t); }, 1e3); break; default: t({ status: "space_error", load_status: "error", message: "This space is experiencing an issue.", detail: o, discussions_enabled: await ke(a) }); break; } } const Ie = async (e, s) => { let t = 0; const n = 12, i = 5e3; return new Promise((r) => { G( e, le.test(e) ? "space_name" : "subdomain", (o) => { s(o), o.status === "running" || o.status === "error" || o.status === "paused" || o.status === "space_error" ? r() : (o.status === "sleeping" || o.status === "building") && (t < n ? (t++, setTimeout(() => { Ie(e, s).then(r); }, i)) : r()); } ); }); }, Lt = /^(?=[^]*\b[dD]iscussions{0,1}\b)(?=[^]*\b[dD]isabled\b)[^]*$/; async function ke(e) { try { const s = await fetch( `https://huggingface.co/api/spaces/${e}/discussions`, { method: "HEAD" } ), t = s.headers.get("x-error-message"); return !(!s.ok || t && Lt.test(t)); } catch { return !1; } } async function Pt(e, s) { const t = {}; s && (t.Authorization = `Bearer ${s}`); try { const n = await fetch( `https://huggingface.co/api/spaces/${e}/${Ye}`, { headers: t } ); if (n.status !== 200) throw new Error("Space hardware could not be obtained."); const { hardware: i } = await n.json(); return i.current; } catch (n) { throw new Error(n.message); } } async function It(e, s, t) { const n = {}; t && (n.Authorization = `Bearer ${t}`); const i = { seconds: s }; try { const r = await fetch( `https://huggingface.co/api/spaces/${e}/${Qe}`, { method: "POST", headers: { "Content-Type": "application/json", ...n }, body: JSON.stringify(i) } ); if (r.status !== 200) throw new Error( "Could not set sleep timeout on duplicated Space. Please visit *ADD HF LINK TO SETTINGS* to set a timeout manually to reduce billing charges." ); return await r.json(); } catch (r) { throw new Error(r.message); } } const Re = [ "cpu-basic", "cpu-upgrade", "cpu-xl", "t4-small", "t4-medium", "a10g-small", "a10g-large", "a10g-largex2", "a10g-largex4", "a100-large", "zero-a10g", "h100", "h100x8" ]; async function jt(e, s) { const { token: t, private: n, hardware: i, timeout: r, auth: o } = s; if (i && !Re.includes(i)) throw new Error( `Invalid hardware type provided. Valid types are: ${Re.map((g) => `"${g}"`).join(",")}.` ); const { http_protocol: a, host: u } = await pe(e, t); let l = null; if (o) { const g = await De( a, u, o, fetch ); g && (l = Ne(g)); } const p = { Authorization: `Bearer ${t}`, "Content-Type": "application/json", ...l ? { Cookie: l.join("; ") } : {} }, c = (await (await fetch("https://huggingface.co/api/whoami-v2", { headers: p })).json()).name, m = e.split("/")[1], w = { repository: `${c}/${m}` }; n && (w.private = !0); let N; try { i || (N = await Pt(e, t)); } catch (g) { throw Error(ue + g.message); } const f = i || N || "cpu-basic"; w.hardware = f; try { const g = await fetch( `https://huggingface.co/api/spaces/${e}/duplicate`, { method: "POST", headers: p, body: JSON.stringify(w) } ); if (g.status === 409) try { return await Y.connect(`${c}/${m}`, s); } catch (q) { throw console.error("Failed to connect Client instance:", q), q; } else if (g.status !== 200) throw new Error(g.statusText); const H = await g.json(); return await It(`${c}/${m}`, r || 300, t), await Y.connect( Ut(H.url), s ); } catch (g) { throw new Error(g); } } function Ut(e) { const s = /https:\/\/huggingface.co\/spaces\/([^/]+\/[^/]+)/, t = e.match(s); if (t) return t[1]; } class qt extends TransformStream { #e = ""; /** Constructs a new instance. */ constructor(s = { allowCR: !1 }) { super({ transform: (t, n) => { for (t = this.#e + t; ; ) { const i = t.indexOf(` `), r = s.allowCR ? t.indexOf("\r") : -1; if (r !== -1 && r !== t.length - 1 && (i === -1 || i - 1 > r)) { n.enqueue(t.slice(0, r)), t = t.slice(r + 1); continue; } if (i === -1) break; const o = t[i - 1] === "\r" ? i - 1 : i; n.enqueue(t.slice(0, o)), t = t.slice(i + 1); } this.#e = t; }, flush: (t) => { if (this.#e === "") return; const n = s.allowCR && this.#e.endsWith("\r") ? this.#e.slice(0, -1) : this.#e; t.enqueue(n); } }); } } function zt(e) { let s = new TextDecoderStream(), t = new qt({ allowCR: !0 }); return e.pipeThrough(s).pipeThrough(t); } function Bt(e) { let t = /[:]\s*/.exec(e), n = t && t.index; if (n) return [ e.substring(0, n), e.substring(n + t[0].length) ]; } function Oe(e, s, t) { e.get(s) || e.set(s, t); } async function* Ft(e, s) { if (!e.body) return; let t = zt(e.body), n, i = t.getReader(), r; for (; ; ) { if (s && s.aborted) return i.cancel(); if (n = await i.read(), n.done) return; if (!n.value) { r && (yield r), r = void 0; continue; } let [o, a] = Bt(n.value) || []; o === "data" ? (r ||= {}, r[o] = r[o] ? r[o] + ` ` + a : a) : o === "event" ? (r ||= {}, r[o] = a) : o === "id" ? (r ||= {}, r[o] = String(+a) === a ? +a : a) : o === "retry" && (r ||= {}, r[o] = +a || void 0); } } async function Gt(e, s) { let t = new Request(e, s); Oe(t.headers, "Accept", "text/event-stream"), Oe(t.headers, "Content-Type", "application/json"); let n = await fetch(t); if (!n.ok) throw n; return Ft(n, t.signal); } async function Mt() { let { event_callbacks: e, unclosed_events: s, pending_stream_messages: t, stream_status: n, config: i, jwt: r } = this; const o = this; if (!i) throw new Error("Could not resolve app config"); n.open = !0; let a = null, u = new URLSearchParams({ session_hash: this.session_hash }).toString(), l = new URL(`${i.root}${this.api_prefix}/${Te}?${u}`); if (r && l.searchParams.set("__sign", r), a = this.stream(l), !a) { console.warn("Cannot connect to SSE endpoint: " + l.toString()); return; } a.onmessage = async function(p) { let c = JSON.parse(p.data); if (c.msg === "close_stream") { de(n, o.abort_controller); return; } const m = c.event_id; if (!m) await Promise.all( Object.keys(e).map( (w) => e[w](c) ) ); else if (e[m] && i) { c.msg === "process_completed" && ["sse", "sse_v1", "sse_v2", "sse_v2.1", "sse_v3"].includes( i.protocol ) && s.delete(m); let w = e[m]; typeof window < "u" && typeof document < "u" ? setTimeout(w, 0, c) : w(c); } else t[m] || (t[m] = []), t[m].push(c); }, a.onerror = async function(p) { console.error(p), await Promise.all( Object.keys(e).map( (c) => e[c]({ msg: "broken_connection", message: M }) ) ); }; } function de(e, s) { e && (e.open = !1, s?.abort()); } function Ht(e, s, t) { !e[s] ? (e[s] = [], t.data.forEach((i, r) => { e[s][r] = i; })) : t.data.forEach((i, r) => { let o = Jt(e[s][r], i); e[s][r] = o, t.data[r] = o; }); } function Jt(e, s) { return s.forEach(([t, n, i]) => { e = Wt(e, n, t, i); }), e; } function Wt(e, s, t, n) { if (s.length === 0) { if (t === "replace") return n; if (t === "append") return e + n; throw new Error(`Unsupported action: ${t}`); } let i = e; for (let o = 0; o < s.length - 1; o++) i = i[s[o]]; const r = s[s.length - 1]; switch (t) { case "replace": i[r] = n; break; case "append": i[r] += n; break; case "add": Array.isArray(i) ? i.splice(Number(r), 0, n) : i[r] = n; break; case "delete": Array.isArray(i) ? i.splice(Number(r), 1) : delete i[r]; break; default: throw new Error(`Unknown action: ${t}`); } return e; } function Zt(e, s = {}) { const t = { close: () => { console.warn("Method not implemented."); }, onerror: null, onmessage: null, onopen: null, readyState: 0, url: e.toString(), withCredentials: !1, CONNECTING: 0, OPEN: 1, CLOSED: 2, addEventListener: () => { throw new Error("Method not implemented."); }, dispatchEvent: () => { throw new Error("Method not implemented."); }, removeEventListener: () => { throw new Error("Method not implemented."); } }; return Gt(e, s).then(async (n) => { t.readyState = t.OPEN; try { for await (const i of n) t.onmessage && t.onmessage(i); t.readyState = t.CLOSED; } catch (i) { t.onerror && t.onerror(i), t.readyState = t.CLOSED; } }).catch((n) => { console.error(n), t.onerror && t.onerror(n), t.readyState = t.CLOSED; }), t; } function Kt(e, s = {}, t, n, i, r) { try { let o = function(h) { (i || ze[h.type]) && p(h); }, a = function() { for (Me = !0; F.length > 0; ) F.shift()({ value: void 0, done: !0 }); }, u = function(h) { F.length > 0 ? F.shift()(h) : ie.push(h); }, l = function(h) { u(Vt(h)), a(); }, p = function(h) { u({ value: h, done: !1 }); }, c = function() { return ie.length > 0 ? Promise.resolve(ie.shift()) : new Promise((h) => F.push(h)); }; const { token: m } = this.options, { fetch: w, app_reference: N, config: f, session_hash: g, api_info: H, api_map: q, stream_status: X, pending_stream_messages: ee, pending_diff_streams: te, event_callbacks: se, unclosed_events: je, post_data: ne, options: J, api_prefix: R } = this, he = r || { "x-gradio-user": "api" }, Ue = this; if (!H) throw new Error("No API found"); if (!f) throw new Error("Could not resolve app config"); let { fn_index: d, endpoint_info: fe, dependency: z } = Yt( H, e, q, f ), qe = wt(s, fe), j, O = f.protocol ?? "ws"; if (O === "ws") throw new Error("WebSocket protocol is not supported in this version"); let U = "", Qt = () => U; const _ = typeof e == "number" ? "/predict" : e; let W, b = null, T = !1, _e = {}, B = typeof window < "u" && typeof document < "u" ? new URLSearchParams(window.location.search).toString() : ""; const ze = J?.events?.reduce( (h, k) => (h[k] = !0, h), {} ) || {}; async function Be() { let h = {}, k = {}; h = { event_id: b }, k = { event_id: b, session_hash: g, fn_index: d }; try { if (!f) throw new Error("Could not resolve app config"); "event_id" in k && await w(`${f.root}${R}/${st}`, { headers: { "Content-Type": "application/json" }, method: "POST", body: JSON.stringify(k) }), await w(`${f.root}${R}/${tt}`, { headers: { "Content-Type": "application/json" }, method: "POST", body: JSON.stringify(h) }); } catch { console.warn( "The `/reset` endpoint could not be called. Subsequent endpoint results may be unreliable." ); } } const Fe = async (h) => { await this._resolve_heartbeat(h); }; async function me(h) { if (!f) return; let k = h.render_id; f.components = [ ...f.components.filter((v) => v.props.rendered_in !== k), ...h.components ], f.dependencies = [ ...f.dependencies.filter((v) => v.rendered_in !== k), ...h.dependencies ]; const Z = f.components.some((v) => v.type === "state"), y = f.dependencies.some( (v) => v.targets.some((L) => L[1] === "unload") ); f.connect_heartbeat = Z || y, await Fe(f), o({ type: "render", data: h, endpoint: _, fn_index: d }); } const Ge = this.handle_blob( f.root, qe, fe ).then(async (h) => { if (W = { data: V( h, z, f.components, "input", !0 ) || [], event_data: t, fn_index: d, trigger_id: n }, Ot(d, f)) o({ type: "status", endpoint: _, stage: "pending", queue: !1, fn_index: d, time: /* @__PURE__ */ new Date() }), ne( `${f.root}${R}/run${_.startsWith("/") ? _ : `/${_}`}${B ? "?" + B : ""}`, { ...W, session_hash: g }, he ).then(async ([y, v]) => { const L = y.data; v == 200 ? (o({ type: "data", endpoint: _, fn_index: d, data: V( L, z, f.components, "output", J.with_null_state ), time: /* @__PURE__ */ new Date(), event_data: t, trigger_id: n }), y.render_config && await me(y.render_config), o({ type: "status", endpoint: _, fn_index: d, stage: "complete", eta: y.average_duration, queue: !1, time: /* @__PURE__ */ new Date() })) : o({ type: "status", stage: "error", endpoint: _, fn_index: d, message: y.error, queue: !1, time: /* @__PURE__ */ new Date() }); }).catch((y) => { o({ type: "status", stage: "error", message: y.message, endpoint: _, fn_index: d, queue: !1, time: /* @__PURE__ */ new Date() }); }); else if (O == "sse") { o({ type: "status", stage: "pending", queue: !0, endpoint: _, fn_index: d, time: /* @__PURE__ */ new Date() }); var Z = new URLSearchParams({ fn_index: d.toString(), session_hash: g }).toString(); let y = new URL( `${f.root}${R}/${Te}?${B ? B + "&" : ""}${Z}` ); if (this.jwt && y.searchParams.set("__sign", this.jwt), j = this.stream(y), !j) return Promise.reject( new Error("Cannot connect to SSE endpoint: " + y.toString()) ); j.onmessage = async function(v) { const L = JSON.parse(v.data), { type: P, status: A, data: x } = Ee( L, _e[d] ); if (P === "update" && A && !T) o({ type: "status", endpoint: _, fn_index: d, time: /* @__PURE__ */ new Date(), ...A }), A.stage === "error" && (j?.close(), a()); else if (P === "data") { let [C, I] = await ne( `${f.root}${R}/queue/data`, { ...W, session_hash: g, event_id: b } ); I !== 200 && (o({ type: "status", stage: "error", message: M, queue: !0, endpoint: _, fn_index: d, time: /* @__PURE__ */ new Date() }), j?.close(), a()); } else P === "complete" ? T = A : P === "log" ? o({ type: "log", title: x.title, log: x.log, level: x.level, endpoint: _, duration: x.duration, visible: x.visible, fn_index: d }) : (P === "generating" || P === "streaming") && o({ type: "status", time: /* @__PURE__ */ new Date(), ...A, stage: A?.stage, queue: !0, endpoint: _, fn_index: d }); x && (o({ type: "data", time: /* @__PURE__ */ new Date(), data: V( x.data, z, f.components, "output", J.with_null_state ), endpoint: _, fn_index: d, event_data: t, trigger_id: n }), T && (o({ type: "status", time: /* @__PURE__ */ new Date(), ...T, stage: A?.stage, queue: !0, endpoint: _, fn_index: d }), j?.close(), a())); }; } else if (O == "sse_v1" || O == "sse_v2" || O == "sse_v2.1" || O == "sse_v3") { o({ type: "status", stage: "pending", queue: !0, endpoint: _, fn_index: d, time: /* @__PURE__ */ new Date() }); let y = ""; typeof window < "u" && typeof document < "u" && (y = window?.location?.hostname); const L = y.includes(".dev.") ? `https://moon-${y.split(".")[1]}.dev.spaces.huggingface.tech` : "https://huggingface.co"; return (typeof window < "u" && typeof document < "u" && window.parent != window && window.supports_zerogpu_headers ? Tt("zerogpu-headers", L) : Promise.resolve(null)).then((C) => { const I = { ...he, ...C || {} }; return ne( `${f.root}${R}/${Ze}?${B}`, { ...W, session_hash: g }, I ); }).then(async ([C, I]) => { if (C.event_id && (U = C.event_id), I === 503) o({ type: "status", stage: "error", message: Ae, queue: !0, endpoint: _, fn_index: d, time: /* @__PURE__ */ new Date(), visible: !0 }); else if (I === 422) o({ type: "status", stage: "error", message: C.detail, queue: !0, endpoint: _, fn_index: d, code: "validation_error", time: /* @__PURE__ */ new Date(), visible: !0 }), a(); else if (I !== 200) o({ type: "status", stage: "error", broken: !1, message: C.detail, queue: !0, endpoint: _, fn_index: d, time: /* @__PURE__ */ new Date(), visible: !0 }); else { b = C.event_id, U = b; let we = async function(oe) { try { const { type: E, status: S, data: $, original_msg: He } = Ee( oe, _e[d] ); if (E == "heartbeat") return; if (E === "update" && S && !T) o({ type: "status", endpoint: _, fn_index: d, time: /* @__PURE__ */ new Date(), original_msg: He, ...S }); else if (E === "complete") T = S; else if (E == "unexpected_error" || E == "broken_connection") { console.error("Unexpected error", S?.message); const Je = E === "broken_connection"; o({ type: "status", stage: "error", message: S?.message || "An Unexpected Error Occurred!", queue: !0, endpoint: _, broken: Je, session_not_found: S?.session_not_found, fn_index: d, time: /* @__PURE__ */ new Date() }); } else if (E === "log") { o({ type: "log", title: $.title, log: $.log, level: $.level, endpoint: _, duration: $.duration, visible: $.visible, fn_index: d }); return; } else (E === "generating" || E === "streaming") && (o({ type: "status", time: /* @__PURE__ */ new Date(), ...S, stage: S?.stage, queue: !0, endpoint: _, fn_index: d }), $ && z.connection !== "stream" && ["sse_v2", "sse_v2.1", "sse_v3"].includes(O) && Ht(te, b, $)); $ && (o({ type: "data", time: /* @__PURE__ */ new Date(), data: V( $.data, z, f.components, "output", J.with_null_state ), endpoint: _, fn_index: d }), $.render_config && await me($.render_config), T && (o({ type: "status", time: /* @__PURE__ */ new Date(), ...T, stage: S?.stage, queue: !0, endpoint: _, fn_index: d }), a())), (S?.stage === "complete" || S?.stage === "error") && (se[b] && delete se[b], b in te && delete te[b]); } catch (E) { console.error("Unexpected client exception", E), o({ type: "status", stage: "error", message: "An Unexpected Error Occurred!", queue: !0, endpoint: _, fn_index: d, time: /* @__PURE__ */ new Date() }), ["sse_v2", "sse_v2.1", "sse_v3"].includes(O) && (de(X, Ue.abort_controller), X.open = !1, a()); } }; b in ee && (ee[b].forEach((oe) => we(oe)), delete ee[b]), se[b] = we, je.add(b), X.open || await this.open_stream(); } }); } }); let Me = !1; const ie = [], F = [], ge = { [Symbol.asyncIterator]: () => ge, next: c, throw: async (h) => (l(h), c()), return: async () => (a(), { value: void 0, done: !0 }), cancel: Be, send_chunk: (h) => { this.post_data(`${f.root}${R}/stream/${U}`, { ...h, session_hash: this.session_hash }); }, close_stream: () => { this.post_data( `${f.root}${R}/stream/${U}/close`, {} ), a(); }, event_id: () => U, wait_for_id: async () => (await Ge, b) }; return ge; } catch (o) { throw console.error("Submit function encountered an error:", o), o; } } function Vt(e) { return { then: (s, t) => t(e) }; } function Yt(e, s, t, n) { let i, r, o; if (typeof s == "number") i = s, r = e.unnamed_endpoints[i], o = n.dependencies.find((a) => a.id == s); else { const a = s.replace(/^\//, ""); i = t[a], r = e.named_endpoints[s.trim()], o = n.dependencies.find( (u) => u.id == t[a] ); } if (typeof i != "number") throw new Error( "There is no endpoint matching that name of fn_index matching that number." ); return { fn_index: i, endpoint_info: r, dependency: o }; } class Y { app_reference; options; deep_link = null; config; api_prefix = ""; api_info; api_map = {}; session_hash = Math.random().toString(36).substring(2); jwt = !1; last_status = {}; cookies = null; // streaming stream_status = { open: !1 }; closed = !1; pending_stream_messages = {}; pending_diff_streams = {}; event_callbacks = {}; unclosed_events = /* @__PURE__ */ new Set(); heartbeat_event = null; abort_controller = null; stream_instance = null; current_payload; get_url_config(s = null) { if (!this.config) throw new Error(D); s === null && (s = window.location.href); const t = (o) => o.replace(/^\/+|\/+$/g, ""); let n = t(new URL(this.config.root).pathname), i = t(new URL(s).pathname), r; return i.startsWith(n) ? r = t(i.substring(n.length)) : r = "", this.get_page_config(r); } get_page_config(s) { if (!this.config) throw new Error(D); let t = this.config; return s in t.page || (s = ""), { ...t, current_page: s, layout: t.page[s].layout, components: t.components.filter( (n) => t.page[s].components.includes(n.id) ), dependencies: this.config.dependencies.filter( (n) => t.page[s].dependencies.includes(n.id) ) }; } fetch(s, t) { const n = new Headers(t?.headers || {}); return this && this.cookies && n.append("Cookie", this.cookies), this && this.options.headers && new Headers(this.options.headers).forEach((r, o) => { n.append(o, r); }), fetch(s, { ...t, headers: n }); } stream(s) { const t = new Headers(); return this && this.cookies && t.append("Cookie", this.cookies), this && this.options.headers && new Headers(this.options.headers).forEach((i, r) => { t.append(r, i); }), this && this.options.token && t.append("Authorization", `Bearer ${this.options.token}`), this.abort_controller = new AbortController(), this.stream_instance = Zt(s.toString(), { credentials: "include", headers: t, signal: this.abort_controller.signal }), this.stream_instance; } view_api; upload_files; upload; handle_blob; post_data; submit; predict; open_stream; resolve_config; resolve_cookies; constructor(s, t = { events: ["data"] }) { this.app_reference = s, this.deep_link = t.query_params?.deep_link || null, t.events || (t.events = ["data"]), this.options = t, this.current_payload = {}, t.cookies && (this.cookies = t.cookies), this.view_api = yt.bind(this), this.upload_files = bt.bind(this), this.handle_blob = At.bind(this), this.post_data = Dt.bind(this), this.submit = Kt.bind(this), this.predict = Nt.bind(this), this.open_stream = Mt.bind(this), this.resolve_config = dt.bind(this), this.resolve_cookies = ht.bind(this), this.upload = kt.bind(this), this.fetch = this.fetch.bind(this), this.handle_space_success = this.handle_space_success.bind(this), this.stream = this.stream.bind(this); } async init() { this.options.auth && await this.resolve_cookies(), await this._resolve_config().then( ({ config: s }) => this._resolve_heartbeat(s) ), this.api_info = await this.view_api(), this.api_map = pt(this.config?.dependencies || []); } async _resolve_heartbeat(s) { if (s && (this.config = s, this.api_prefix = s.api_prefix || "", this.config && this.config.connect_heartbeat && this.config.space_id && this.options.token && (this.jwt = await be( this.config.space_id, this.options.token, this.cookies ))), s.space_id && this.options.token && (this.jwt = await be(s.space_id, this.options.token)), this.config && this.config.connect_heartbeat) { const t = new URL( `${this.config.root}${this.api_prefix}/${Xe}/${this.session_hash}` ); this.jwt && t.searchParams.set("__sign", this.jwt), this.heartbeat_event || (this.heartbeat_event = this.stream(t)); } } static async connect(s, t = { events: ["data"] }) { const n = new this(s, t); return t.session_hash && (n.session_hash = t.session_hash), await n.init(), n; } async reconnect() { const s = new URL( `${this.config.root}${this.api_prefix}/${nt}` ); let t; try { const n = await this.fetch(s); if (!n.ok) throw new Error(); t = (await n.json()).app_id; } catch { return "broken"; } return t !== this.config.app_id ? "changed" : "connected"; } close() { this.closed = !0, de(this.stream_status, this.abort_controller); } set_current_payload(s) { this.current_payload = s; } static async duplicate(s, t = { events: ["data"] }) { return jt(s, t); } async _resolve_config() { const { http_protocol: s, host: t, space_id: n } = await pe( this.app_reference, this.options.token ), { status_callback: i } = this.options; n && i && await Ie(n, i); let r; try { let o = `${s}//${t}`; if (r = await this.resolve_config(o), !r) throw new Error(D); return this.config_success(r); } catch (o) { if (n && i) G( n, le.test(n) ? "space_name" : "subdomain", this.handle_space_success ); else throw i && i({ status: "error", message: "Could not load this space.", load_status: "error", detail: "NOT_FOUND" }), Error(o); } } async config_success(s) { if (this.config = s, this.api_prefix = s.api_prefix || "", this.config.auth_required) return this.prepare_return_obj(); try { this.api_info = await this.view_api(); } catch (t) { console.error(ot + t.message); } return this.prepare_return_obj(); } async handle_space_success(s) { if (!this) throw new Error(D); const { status_callback: t } = this.options; if (t && t(s), s.status === "running") try { if (this.config = await this._resolve_config(), this.api_prefix = this?.config?.api_prefix || "", !this.config) throw new Error(D); return await this.config_success(this.config); } catch (n) { throw t && t({ status: "error", message: "Could not load this space.", load_status: "error", detail: "NOT_FOUND" }), n; } } async component_server(s, t, n) { if (!this.config) throw new Error(D); const i = {}, { token: r } = this.options, { session_hash: o } = this; r && (i.Authorization = `Bearer ${this.options.token}`); let a, u = this.config.components.find( (p) => p.id === s ); u?.props?.root_url ? a = u.props.root_url : a = this.config.root; let l; if ("binary" in n) { l = new FormData(); for (const p in n.data) p !== "binary" && l.append(p, n.data[p]); l.set("component_id", s.toString()), l.set("fn_name", t), l.set("session_hash", o); } else l = JSON.stringify({ data: n, component_id: s, fn_name: t, session_hash: o }), i["Content-Type"] = "application/json"; r && (i.Authorization = `Bearer ${r}`); try { const p = await this.fetch( `${a}${this.api_prefix}/${et}/`, { method: "POST", body: l, headers: i, credentials: "include" } ); if (!p.ok) throw new Error( "Could not connect to component server: " + p.statusText ); return await p.json(); } catch (p) { console.warn(p); } } set_cookies(s) { this.cookies = Ne(s).join("; "); } prepare_return_obj() { return { config: this.config, predict: this.predict, submit: this.submit, view_api: this.view_api, component_server: this.component_server }; } } async function ts(e, s = { events: ["data"] }) { return await Y.connect(e, s); } async function ss(e, s) { return await Y.duplicate(e, s); } export { Y as Client, Q as FileData, ct as MISSING_CREDENTIALS_MSG, ts as client, ss as duplicate, es as handle_file, Nt as predict, Xt as prepare_files, Kt as submit, kt as upload, bt as upload_files };