File size: 1,676 Bytes
aa937f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import { env, pipeline } from "@huggingface/transformers";
import "./style.css";

const MODEL_ID = "Reza2kn/MiniCPM5-1B-ONNX-Web";

const output = document.querySelector("#output");
const run = document.querySelector("#run");
const prompt = document.querySelector("#prompt");
const maxTokens = document.querySelector("#maxTokens");
const temperature = document.querySelector("#temperature");
const backend = document.querySelector("#backend");

env.allowLocalModels = false;
env.backends.onnx.wasm.numThreads = Math.min(4, navigator.hardwareConcurrency || 4);

let generatorPromise = null;

function setStatus(text) {
  output.textContent = text;
}

async function getGenerator() {
  if (!generatorPromise) {
    setStatus(`Loading ${MODEL_ID} with ${backend.value}...`);
    generatorPromise = pipeline("text-generation", MODEL_ID, {
      device: backend.value,
      dtype: "q4",
    });
  }
  return generatorPromise;
}

backend.addEventListener("change", () => {
  generatorPromise = null;
  setStatus("Backend changed. Run again to reload.");
});

run.addEventListener("click", async () => {
  run.disabled = true;
  try {
    const generator = await getGenerator();
    setStatus("Generating...");
    const result = await generator(prompt.value, {
      max_new_tokens: Number(maxTokens.value),
      temperature: Number(temperature.value),
      do_sample: Number(temperature.value) > 0,
    });
    setStatus(result?.[0]?.generated_text ?? JSON.stringify(result, null, 2));
  } catch (error) {
    setStatus(error.stack || error.message || String(error));
  } finally {
    run.disabled = false;
  }
});

setStatus("Ready. Upload the ONNX-Web artifact, then run.");