const assets = { "openvla-7b": "/assets/openvla-tabletop.png", "octo-small-1.5": "/assets/octo-bridge.jpg", "ltx-video-0.9.5": "/assets/ltx-prediction.png", "groot-n1-5-3b": "/assets/groot-n1-5-3b.png", "pi0-5-base": "/assets/pi0-5-base.png", "pi0-base": "/assets/pi0-base.png", "smolvla-base": "/assets/smolvla-base.png", "ecot-openvla-7b-bridge": "/assets/ecot-openvla-7b-bridge.png", "droid-1-0-1": "/assets/droid-1-0-1.png", "modified-libero-rlds": "/assets/modified-libero-rlds.png", pusht: "/assets/pusht.png", "aloha-transfer-cube-human": "/assets/aloha-transfer-cube-human.png", "metaworld-mt50": "/assets/metaworld-mt50.png", "xarm-lift-medium": "/assets/xarm-lift-medium.png", }; const taskLabels = { vla: "VLA", world: "World", state_world: "State space" }; const categoryLabels = { generalist: "Generalist", manipulation: "Manipulation", simulation: "Simulation", }; const modelFilters = [ ["all", "All"], ["vla", "VLA"], ["world", "World"], ["state_world", "State space"], ]; const datasetFilters = [ ["all", "All"], ["generalist", "Generalist"], ["manipulation", "Manipulation"], ["simulation", "Simulation"], ]; const state = { models: [], datasets: [], view: "models", filter: "all", verifiedOnly: false, query: "", sort: "verified", current: null, }; const $ = (id) => document.getElementById(id); const grid = $("modelGrid"); const dialog = $("modelDialog"); const submissionDialog = $("submissionDialog"); function escapeHtml(value) { return String(value ?? "").replace(/[&<>'"]/g, (char) => ({ "&": "&", "<": "<", ">": ">", "'": "'", '"': """, })[char]); } async function api(path, options = {}) { const response = await fetch(path, { ...options, headers: { Accept: "application/json", ...(options.headers || {}) }, }); if (!response.ok) { let message = `Request failed (${response.status})`; try { const body = await response.json(); if (typeof body.detail === "string") message = body.detail; else if (Array.isArray(body.detail)) message = body.detail.map((item) => item.msg).join("; "); } catch (_) { // Keep the status-based message when the response is not JSON. } throw new Error(message); } return response.json(); } function imageFor(item) { return assets[item.slug] || "/assets/openvla-tabletop.png"; } function badge(label, className = "") { return `${escapeHtml(label)}`; } function compactNumber(value) { return new Intl.NumberFormat("en", { notation: "compact", maximumFractionDigits: 1 }).format(value || 0); } function storageLabel(value) { if (value >= 100) return `${Math.round(value)} GB`; if (value >= 10) return `${value.toFixed(1)} GB`; if (value >= 1) return `${value.toFixed(2)} GB`; return `${Math.round(value * 1000)} MB`; } function commandFor(item, kind) { if (kind === "dataset") { return `hf download ${item.source.repo_id} --repo-type dataset --revision ${item.source.revision} --local-dir .cache/datasets/${item.slug}`; } if (item.verification.status !== "verified") { return `hf download ${item.source.repo_id} --revision ${item.source.revision} --local-dir .cache/models/${item.slug}`; } const path = `.cache/models/${item.slug}`; const dtype = item.runtime.dtype ? ` --dtype ${item.runtime.dtype}` : ""; return `airgpt pull ${item.slug} --local-dir ${path}\nairgpt serve --model ${item.runtime.registry_model} --model-path ${path} --device ${item.runtime.device}${dtype}`; } function currentItems() { return state.view === "models" ? state.models : state.datasets; } function visibleItems() { const needle = state.query.trim().toLowerCase(); const items = currentItems().filter((item) => { const extra = state.view === "models" ? [item.task, item.runtime.backend] : [item.category, item.robot, item.format, ...item.tasks]; const haystack = [item.slug, item.display_name, item.summary, item.source.repo_id, ...item.tags, ...extra].join(" ").toLowerCase(); const filterValue = state.view === "models" ? item.task : item.category; return (!needle || haystack.includes(needle)) && (state.filter === "all" || filterValue === state.filter) && (state.view !== "models" || !state.verifiedOnly || item.verification.status === "verified"); }); items.sort((a, b) => { if (state.sort === "name") return a.display_name.localeCompare(b.display_name); if (state.sort === "vram") return a.hardware.recommended_vram_gb - b.hardware.recommended_vram_gb; if (state.sort === "size") return a.storage_gb - b.storage_gb; if (state.sort === "popular") return (b.upstream?.downloads || 0) - (a.upstream?.downloads || 0) || a.slug.localeCompare(b.slug); return Number(b.verification.status === "verified") - Number(a.verification.status === "verified") || a.slug.localeCompare(b.slug); }); return items; } function modelCardTemplate(model) { const repositoryThumb = model.verification.status !== "verified" ? " repository-thumb" : ""; const mediaClass = model.slug === "openvla-7b" ? "card-media synthetic" : `card-media${repositoryThumb}`; const tags = model.tags.slice(0, 4).map((tag) => `${escapeHtml(tag)}`).join(""); const statusClass = model.verification.status === "verified" ? "verified" : "community"; return `
${escapeHtml(model.display_name)} catalog preview
${badge(model.verification.status, statusClass)} ${badge(taskLabels[model.task], model.task === "world" ? "world" : "")}

${escapeHtml(model.source.repo_id)}

${escapeHtml(model.display_name)}

${escapeHtml(model.summary)}

VRAM${model.hardware.recommended_vram_gb} GB
Backend${escapeHtml(model.runtime.backend)}
License${escapeHtml(model.source.license)}
${tags}
`; } function datasetCardTemplate(dataset) { const tags = dataset.tags.slice(0, 4).map((tag) => `${escapeHtml(tag)}`).join(""); return `
${escapeHtml(dataset.display_name)} repository preview
${badge("curated", "verified")} ${badge(categoryLabels[dataset.category], dataset.category === "simulation" ? "world" : "")}

${escapeHtml(dataset.source.repo_id)}

${escapeHtml(dataset.display_name)}

${escapeHtml(dataset.summary)}

Storage${storageLabel(dataset.storage_gb)}
Format${escapeHtml(dataset.format.split(" / ")[0])}
License${escapeHtml(dataset.source.license)}
${tags}
`; } function renderFilters() { const filters = state.view === "models" ? modelFilters : datasetFilters; $("taskTabs").setAttribute("aria-label", state.view === "models" ? "Model task" : "Dataset category"); $("taskTabs").innerHTML = filters.map(([value, label]) => ` `).join(""); } function renderToolbar() { const datasets = state.view === "datasets"; $("catalogTitle").textContent = datasets ? "Datasets" : "Models"; $("catalogEyebrow").textContent = datasets ? "Robotics data" : "Embodied intelligence"; $("searchInput").placeholder = datasets ? "Dataset, robot, task, format, or tag" : "Model, task, backend, or tag"; $("verifiedFilter").classList.toggle("hidden", datasets); $("openSubmission").classList.toggle("hidden", datasets); const options = datasets ? [["popular", "Most downloaded"], ["name", "Name"], ["size", "Storage low to high"]] : [["verified", "Verified first"], ["popular", "Most downloaded"], ["name", "Name"], ["vram", "VRAM low to high"]]; if (!options.some(([value]) => value === state.sort)) state.sort = datasets ? "popular" : "verified"; $("sortSelect").innerHTML = options.map(([value, label]) => ``).join(""); renderFilters(); } function render() { const items = visibleItems(); const singular = state.view === "models" ? "model" : "dataset"; $("resultCount").textContent = `${items.length} ${singular}${items.length === 1 ? "" : "s"}`; grid.innerHTML = ""; items.forEach((item) => { const card = document.createElement("article"); card.className = "model-card"; card.tabIndex = 0; card.dataset.slug = item.slug; card.setAttribute("aria-label", `Open ${item.display_name}`); card.innerHTML = state.view === "models" ? modelCardTemplate(item) : datasetCardTemplate(item); card.addEventListener("click", () => openItem(item, state.view === "models" ? "model" : "dataset", true)); card.addEventListener("keydown", (event) => { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); openItem(item, state.view === "models" ? "model" : "dataset", true); } }); grid.appendChild(card); }); $("emptyState").classList.toggle("hidden", items.length !== 0); } function spec(label, value) { return `
${escapeHtml(label)}
${escapeHtml(value)}
`; } function openItem(item, kind, updateHistory = false) { state.current = { item, kind }; const isDataset = kind === "dataset"; const upstream = item.upstream; $("detailImage").src = imageFor(item); $("detailImage").alt = `${item.display_name} catalog preview`; $("detailRepo").textContent = item.source.repo_id; $("detailTitle").textContent = item.display_name; $("detailSummary").textContent = item.summary; $("modelCardLink").href = `https://huggingface.co/${isDataset ? "datasets/" : ""}${item.source.repo_id}`; $("modelCardLink").textContent = isDataset ? "Dataset card" : "Model card"; $("detailImage").parentElement.classList.toggle("repository-thumb", isDataset || item.verification.status !== "verified"); const updateBadge = upstream?.update_available ? badge("update available", "update") : ""; const specs = []; if (isDataset) { $("detailBadges").innerHTML = badge("curated", "verified") + badge(categoryLabels[item.category], item.category === "simulation" ? "world" : "") + badge(item.source.license, "license") + updateBadge; specs.push( spec("Storage", storageLabel(item.storage_gb)), spec("Dataset size", item.size_label), spec("Format", item.format), spec("Robot", item.robot), spec("Revision", item.source.revision.slice(0, 12)), spec("Modalities", item.modalities.join(", ")), ); if (upstream) specs.push(spec("Downloads", compactNumber(upstream.downloads)), spec("Likes", compactNumber(upstream.likes))); $("secondaryTabLabel").textContent = "Curation"; $("quickstartLabel").textContent = "Pinned dataset download"; $("verificationPanel").innerHTML = `
${escapeHtml(item.curation.status)}${escapeHtml(item.robot)}${escapeHtml(item.format)}

${escapeHtml(item.curation.notes || "Curated catalog entry.")}

`; } else { const statusClass = item.verification.status === "verified" ? "verified" : "community"; $("detailBadges").innerHTML = badge(item.verification.status, statusClass) + badge(taskLabels[item.task], item.task === "world" ? "world" : "") + badge(item.source.license, "license") + updateBadge; specs.push( spec("Recommended VRAM", `${item.hardware.recommended_vram_gb} GB`), spec("Minimum VRAM", `${item.hardware.minimum_vram_gb} GB`), spec("Backend", item.runtime.backend), spec("Adapter", item.runtime.adapter), spec("Revision", item.source.revision.slice(0, 12)), spec("Device", item.runtime.device), ); if (upstream) specs.push( spec("Downloads", compactNumber(upstream.downloads)), spec("Likes", compactNumber(upstream.likes)), spec("Latest revision", upstream.latest_revision.slice(0, 12)), spec("Upstream status", upstream.update_available ? "Update available" : "Pinned revision current"), ); $("secondaryTabLabel").textContent = "Verification"; $("quickstartLabel").textContent = item.verification.status === "verified" ? "AirGPT Runtime" : "Pinned model download"; const checks = item.verification.checks.length ? item.verification.checks : ["Runtime adapter validation pending", item.hardware.notes || "Community hardware estimate"]; $("verificationPanel").innerHTML = `
${item.verification.status === "verified" ? `Tested ${escapeHtml(item.verification.tested_at || "-")}` : "Community catalog entry"} ${escapeHtml(item.verification.device || "Runtime adapter pending")} ${item.verification.airgpt_version ? `Runtime ${escapeHtml(item.verification.airgpt_version)}` : "Not runtime verified"}
`; } $("detailSpecs").innerHTML = specs.join(""); $("commandOutput").textContent = commandFor(item, kind); $("manifestOutput").textContent = JSON.stringify(item, null, 2); switchDetailTab("quickstart"); if (updateHistory) history.pushState({ slug: item.slug, kind }, "", `/?${kind}=${encodeURIComponent(item.slug)}`); if (!dialog.open) dialog.showModal(); } function switchDetailTab(tab) { document.querySelectorAll("[data-detail-tab]").forEach((button) => { const active = button.dataset.detailTab === tab; button.classList.toggle("active", active); button.setAttribute("aria-selected", String(active)); }); document.querySelectorAll("[data-detail-panel]").forEach((panel) => { panel.classList.toggle("hidden", panel.dataset.detailPanel !== tab); }); } function closeItem(updateHistory = true) { if (dialog.open) dialog.close(); state.current = null; const params = new URLSearchParams(location.search); if (updateHistory && (params.has("model") || params.has("dataset"))) history.pushState({}, "", "/"); } function toast(message) { const node = $("toast"); node.textContent = message; node.classList.add("visible"); window.setTimeout(() => node.classList.remove("visible"), 1600); } function switchView(view) { state.view = view; state.filter = "all"; state.query = ""; $("searchInput").value = ""; document.querySelectorAll("[data-view]").forEach((button) => { const active = button.dataset.view === view; button.classList.toggle("active", active); button.setAttribute("aria-selected", String(active)); }); renderToolbar(); render(); } function openSubmission() { $("submissionForm").classList.remove("hidden"); $("submissionResult").classList.add("hidden"); $("submissionError").classList.add("hidden"); if (!submissionDialog.open) submissionDialog.showModal(); } function closeSubmission() { if (submissionDialog.open) submissionDialog.close(); } function submissionPayload(form) { const data = new FormData(form); const optional = (name) => String(data.get(name) || "").trim() || null; return { repo_id: String(data.get("repo_id") || "").trim(), slug: String(data.get("slug") || "").trim(), display_name: optional("display_name"), task: data.get("task"), registry_model: String(data.get("registry_model") || "").trim(), backend: String(data.get("backend") || "").trim(), adapter: String(data.get("adapter") || "").trim(), device: String(data.get("device") || "").trim(), dtype: optional("dtype"), minimum_vram_gb: Number(data.get("minimum_vram_gb")), recommended_vram_gb: Number(data.get("recommended_vram_gb")), summary: String(data.get("summary") || "").trim(), tags: String(data.get("tags") || "").split(",").map((tag) => tag.trim()).filter(Boolean), }; } async function validateSubmission(event) { event.preventDefault(); const form = event.currentTarget; const submit = $("validateSubmission"); const error = $("submissionError"); error.classList.add("hidden"); submit.disabled = true; submit.textContent = "Validating..."; try { const result = await api("/api/submissions/validate", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(submissionPayload(form)), }); $("candidateOutput").textContent = JSON.stringify(result.candidate, null, 2); $("submissionWarnings").innerHTML = result.warnings.map((warning) => `
  • ${escapeHtml(warning)}
  • `).join(""); $("submissionWarnings").classList.toggle("hidden", result.warnings.length === 0); $("submissionStatus").textContent = result.warnings.length ? `Validated with ${result.warnings.length} item${result.warnings.length === 1 ? "" : "s"} for maintainer review.` : "Validated against the current Hugging Face revision."; form.classList.add("hidden"); $("submissionResult").classList.remove("hidden"); } catch (requestError) { error.textContent = requestError.message; error.classList.remove("hidden"); } finally { submit.disabled = false; submit.textContent = "Validate candidate"; } } async function loadCatalog() { try { const [modelBody, datasetBody] = await Promise.all([api("/api/catalog"), api("/api/datasets")]); state.models = modelBody.models; state.datasets = datasetBody.datasets; $("catalogSource").textContent = `${state.models.length} models · ${state.datasets.length} datasets · Live Hugging Face metadata`; renderToolbar(); render(); const params = new URLSearchParams(location.search); const datasetSlug = params.get("dataset"); const modelSlug = params.get("model"); if (datasetSlug) { switchView("datasets"); const dataset = state.datasets.find((item) => item.slug === datasetSlug); if (dataset) openItem(dataset, "dataset", false); } else if (modelSlug) { const model = state.models.find((item) => item.slug === modelSlug); if (model) openItem(model, "model", false); } } catch (error) { $("resultCount").textContent = "Unavailable"; $("catalogSource").textContent = error.message; $("emptyState").classList.remove("hidden"); $("emptyState").querySelector("strong").textContent = "Catalog unavailable"; $("emptyState").querySelector("span").textContent = "The service could not load a valid catalog."; } } $("searchInput").addEventListener("input", (event) => { state.query = event.target.value; render(); }); $("sortSelect").addEventListener("change", (event) => { state.sort = event.target.value; render(); }); $("verifiedOnly").addEventListener("change", (event) => { state.verifiedOnly = event.target.checked; render(); }); $("taskTabs").addEventListener("click", (event) => { const button = event.target.closest("button[data-filter]"); if (!button) return; state.filter = button.dataset.filter; renderFilters(); render(); }); $("contentTabs").addEventListener("click", (event) => { const button = event.target.closest("button[data-view]"); if (button) switchView(button.dataset.view); }); document.querySelectorAll("[data-detail-tab]").forEach((button) => button.addEventListener("click", () => switchDetailTab(button.dataset.detailTab))); $("closeDialog").addEventListener("click", () => closeItem()); dialog.addEventListener("click", (event) => { if (event.target === dialog) closeItem(); }); dialog.addEventListener("cancel", (event) => { event.preventDefault(); closeItem(); }); $("copyCommand").addEventListener("click", async () => { if (!state.current) return; await navigator.clipboard.writeText(commandFor(state.current.item, state.current.kind)); toast("Command copied"); }); $("openSubmission").addEventListener("click", openSubmission); $("closeSubmission").addEventListener("click", closeSubmission); $("submissionForm").addEventListener("submit", validateSubmission); $("editSubmission").addEventListener("click", () => { $("submissionResult").classList.add("hidden"); $("submissionForm").classList.remove("hidden"); }); $("copyCandidate").addEventListener("click", async () => { await navigator.clipboard.writeText($("candidateOutput").textContent); toast("Candidate copied"); }); submissionDialog.addEventListener("click", (event) => { if (event.target === submissionDialog) closeSubmission(); }); window.addEventListener("popstate", () => { const params = new URLSearchParams(location.search); const dataset = state.datasets.find((item) => item.slug === params.get("dataset")); const model = state.models.find((item) => item.slug === params.get("model")); if (dataset) { switchView("datasets"); openItem(dataset, "dataset", false); } else if (model) { switchView("models"); openItem(model, "model", false); } else closeItem(false); }); loadCatalog();