Spaces:
Running
Running
import { pipeline, env } from "@xenova/transformers"; | |
const MODEL_ID = "onnx-community/orpheus-3b-0.1-ft-ONNX"; | |
const modal = document.getElementById("modal"); | |
const modalText = document.getElementById("modal-text"); | |
const progressBar = document.getElementById("progress-fill"); | |
const inputEl = document.getElementById("input-text"); | |
const btnEl = document.getElementById("generate-btn"); | |
const loadingEl = document.getElementById("loading-text"); | |
const outputEl = document.getElementById("output-text"); | |
let generator = null; | |
// Set up ONNX WASM paths (optional) | |
env.backends.onnx.wasm.wasmPaths = "https://cdn.jsdelivr.net/npm/@xenova/transformers@2.17.2/dist/"; | |
env.useWasmCPU(); | |
btnEl.addEventListener("click", async () => { | |
const prompt = inputEl.value.trim(); | |
if (!prompt) return; | |
btnEl.disabled = true; | |
outputEl.textContent = ""; | |
loadingEl.textContent = ""; | |
// Show downloading modal | |
modal.classList.remove("hidden"); | |
progressBar.style.width = "0%"; | |
modalText.textContent = "Loading model... 0%"; | |
// Load (or reuse) pipeline with progress callback :contentReference[oaicite:0]{index=0} | |
if (!generator) { | |
generator = await pipeline("text2text-generation", MODEL_ID, { | |
progress_callback: (args) => { | |
if (args.status === "progress") { | |
const pct = Math.floor(args.progress * 100); | |
progressBar.style.width = pct + "%"; | |
modalText.textContent = `Loading model... ${pct}%`; | |
} | |
}, | |
}); | |
} | |
// Hide modal | |
modalText.textContent = "Model ready!"; | |
await new Promise((r) => setTimeout(r, 300)); | |
modal.classList.add("hidden"); | |
// Stream tokens as they generate :contentReference[oaicite:1]{index=1} | |
loadingEl.classList.remove("hidden"); | |
await generator(prompt, { | |
max_length: 256, | |
callback_function: (beams) => { | |
// beams may be an array of { token, text, ... } | |
// append the latest token or text | |
const tok = typeof beams === "string" | |
? beams | |
: (beams[0]?.text || beams[0]?.token || ""); | |
loadingEl.textContent += tok; | |
}, | |
}); | |
// Final output from the pipeline | |
const [res] = await generator(prompt, { max_length: 0 }); | |
loadingEl.classList.add("hidden"); | |
outputEl.textContent = res.generated_text; | |
btnEl.disabled | |