|
5 | 5 |
|
6 | 6 | import { EventEmitter } from "events";
|
7 | 7 | import callCallback from "../utils/callcallback";
|
8 |
| -import handleArguments from "../utils/handleArguments"; |
9 | 8 |
|
10 | 9 | import Llama2 from './llama2.js';
|
11 | 10 | import Llama2Wasm from './llama2.wasm';
|
12 | 11 | import Llama2Data from './llama2.data';
|
13 | 12 |
|
14 | 13 |
|
15 | 14 | class LanguageModel extends EventEmitter {
|
16 |
| - constructor(optionsOrCb, cb) { |
| 15 | + constructor(modelNameOrOptions, callback) { |
17 | 16 | super();
|
18 | 17 |
|
19 | 18 | this.options = {
|
20 |
| - modelUrl: 'https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin', // if set, model.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) |
| 19 | + modelUrl: '', // if set, model.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not) |
21 | 20 | tokenizerUrl: '', // if set, tokenizer.bin will be preloaded from provided URL (assumed to be embedded in llama2.data if not)
|
22 | 21 | steps: 0, // how many tokens to generate (defaults to model's maximum)
|
23 | 22 | temperature: 0.9, // 0.0 = (deterministic) argmax sampling, 1.0 = baseline
|
24 | 23 | stopOnBosOrEos: true, // stop when encountering beginning-of-sequence or end-of-sequence token
|
25 | 24 | };
|
26 | 25 |
|
27 | 26 | // handle arguments
|
28 |
| - let callback; |
29 |
| - if (typeof optionsOrCb === 'function') { |
30 |
| - callback = optionsOrCb; |
31 |
| - } else { |
32 |
| - if (typeof optionsOrCb === 'object') { |
33 |
| - this.options.modelUrl = (typeof optionsOrCb.modelUrl === 'string') ? optionsOrCb.modelUrl : this.options.modelUrl; |
34 |
| - this.options.tokenizerUrl = (typeof optionsOrCb.tokenizerUrl === 'string') ? optionsOrCb.tokenizerUrl : this.options.tokenizerUrl; |
35 |
| - } |
36 |
| - if (typeof cb === 'function') { |
37 |
| - callback = cb; |
| 27 | + if (typeof modelNameOrOptions === 'string') { |
| 28 | + switch (modelNameOrOptions) { |
| 29 | + // see https://huggingface.co/karpathy/tinyllamas for TinyStories-* |
| 30 | + case 'TinyStories-15M': |
| 31 | + this.options.modelUrl = 'https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin'; |
| 32 | + break; |
| 33 | + case 'TinyStories-42M': |
| 34 | + this.options.modelUrl = 'https://huggingface.co/karpathy/tinyllamas/resolve/main/stories42M.bin'; |
| 35 | + break; |
| 36 | + case 'TinyStories-110M': |
| 37 | + this.options.modelUrl = 'https://huggingface.co/karpathy/tinyllamas/resolve/main/stories110M.bin'; |
| 38 | + break; |
| 39 | + default: |
| 40 | + throw 'Unrecognized model ' + modelNameOrUrl + ', try e.g. TinyStories-15M'; |
38 | 41 | }
|
| 42 | + } else if (typeof modelNameOrUrl === 'object') { |
| 43 | + this.options.modelUrl = (typeof modelNameOrOptions.modelUrl === 'string') ? modelNameOrOptions.modelUrl : this.options.modelUrl; |
| 44 | + this.options.tokenizerUrl = (typeof modelNameOrOptions.tokenizerUrl === 'string') ? modelNameOrOptions.tokenizerUrl : this.options.tokenizerUrl; |
| 45 | + } |
| 46 | + |
| 47 | + if (!this.options.modelUrl) { |
| 48 | + throw 'You need to provide the name of the model to load, e.g. TinyStories-15M'; |
39 | 49 | }
|
40 | 50 |
|
41 | 51 | this.out = '';
|
@@ -279,9 +289,8 @@ class LanguageModel extends EventEmitter {
|
279 | 289 | * exposes LanguageModel class through function
|
280 | 290 | * @returns {Object|Promise<Boolean>} A new LanguageModel instance
|
281 | 291 | */
|
282 |
| -const languageModel = (...inputs) => { |
283 |
| - const { options = {}, callback } = handleArguments(...inputs); |
284 |
| - const instance = new LanguageModel(options, callback); |
| 292 | +const languageModel = (modelNameOrOptions, callback) => { |
| 293 | + const instance = new LanguageModel(modelNameOrOptions, callback); |
285 | 294 | return instance;
|
286 | 295 | };
|
287 | 296 |
|
|
0 commit comments