File size: 1,781 Bytes
a7634ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import {
  LoadModelConfig,
  SamplingConfig,
  Wllama,
  AssetsPathConfig,
} from "@wllama/wllama";
import singleThreadWllamaJsUrl from "@wllama/wllama/esm/single-thread/wllama.js?url";
import singleThreadWllamaWasmUrl from "@wllama/wllama/esm/single-thread/wllama.wasm?url";
import multiThreadWllamaJsUrl from "@wllama/wllama/esm/multi-thread/wllama.js?url";
import multiThreadWllamaWasmUrl from "@wllama/wllama/esm/multi-thread/wllama.wasm?url";
import multiThreadWllamaWorkerMjsUrl from "@wllama/wllama/esm/multi-thread/wllama.worker.mjs?url";

let wllama: Wllama | undefined;

export async function initializeWllama(config: {

  modelUrl: string;

  modelConfig?: LoadModelConfig;

}) {
  const wllamaConfigPaths: AssetsPathConfig = {
    "single-thread/wllama.js": singleThreadWllamaJsUrl,
    "single-thread/wllama.wasm": singleThreadWllamaWasmUrl,
    "multi-thread/wllama.js": multiThreadWllamaJsUrl,
    "multi-thread/wllama.wasm": multiThreadWllamaWasmUrl,
    "multi-thread/wllama.worker.mjs": multiThreadWllamaWorkerMjsUrl,
  };

  wllama = new Wllama(wllamaConfigPaths);

  return wllama.loadModelFromUrl(config.modelUrl, config.modelConfig ?? {});
}

export async function runCompletion(config: {

  prompt: string;

  nPredict?: number;

  sampling?: SamplingConfig;

  onNewToken: (token: number, piece: Uint8Array, currentText: string) => void;

}) {
  if (!wllama) throw new Error("Wllama is not initialized.");

  return wllama.createCompletion(config.prompt, {
    nPredict: config.nPredict,
    sampling: config.sampling,
    onNewToken: config.onNewToken,
  });
}

export async function exitWllama() {
  if (!wllama) throw new Error("Wllama is not initialized.");

  await wllama.exit();

  wllama = undefined;
}