@@ -87,6 +87,26 @@ Napi::Value getGpuVramInfo(const Napi::CallbackInfo& info) {
87
87
return result;
88
88
}
89
89
90
+ static Napi::Value getNapiToken (const Napi::CallbackInfo& info, llama_model* model, llama_token token) {
91
+ auto tokenType = llama_token_get_type (model, token);
92
+
93
+ if (tokenType == LLAMA_TOKEN_TYPE_UNDEFINED || tokenType == LLAMA_TOKEN_TYPE_UNKNOWN) {
94
+ return Napi::Number::From (info.Env (), -1 );
95
+ }
96
+
97
+ return Napi::Number::From (info.Env (), token);
98
+ }
99
+
100
+ static Napi::Value getNapiControlToken (const Napi::CallbackInfo& info, llama_model* model, llama_token token) {
101
+ auto tokenType = llama_token_get_type (model, token);
102
+
103
+ if (tokenType != LLAMA_TOKEN_TYPE_CONTROL) {
104
+ return Napi::Number::From (info.Env (), -1 );
105
+ }
106
+
107
+ return Napi::Number::From (info.Env (), token);
108
+ }
109
+
90
110
class AddonModel : public Napi ::ObjectWrap<AddonModel> {
91
111
public:
92
112
llama_model_params model_params;
@@ -119,7 +139,6 @@ class AddonModel : public Napi::ObjectWrap<AddonModel> {
119
139
}
120
140
}
121
141
122
- llama_backend_init (false );
123
142
model = llama_load_model_from_file (modelPath.c_str (), model_params);
124
143
125
144
if (model == NULL ) {
@@ -203,6 +222,15 @@ class AddonModel : public Napi::ObjectWrap<AddonModel> {
203
222
return Napi::Number::From (info.Env (), llama_n_ctx_train (model));
204
223
}
205
224
225
+ Napi::Value GetEmbeddingVectorSize (const Napi::CallbackInfo& info) {
226
+ if (disposed) {
227
+ Napi::Error::New (info.Env (), " Context is disposed" ).ThrowAsJavaScriptException ();
228
+ return info.Env ().Undefined ();
229
+ }
230
+
231
+ return Napi::Number::From (info.Env (), llama_n_embd (model));
232
+ }
233
+
206
234
Napi::Value GetTotalSize (const Napi::CallbackInfo& info) {
207
235
if (disposed) {
208
236
Napi::Error::New (info.Env (), " Context is disposed" ).ThrowAsJavaScriptException ();
@@ -239,55 +267,55 @@ class AddonModel : public Napi::ObjectWrap<AddonModel> {
239
267
return info.Env ().Undefined ();
240
268
}
241
269
242
- return Napi::Number::From (info. Env () , llama_token_bos (model));
270
+ return getNapiControlToken (info, model , llama_token_bos (model));
243
271
}
244
272
Napi::Value TokenEos (const Napi::CallbackInfo& info) {
245
273
if (disposed) {
246
274
Napi::Error::New (info.Env (), " Context is disposed" ).ThrowAsJavaScriptException ();
247
275
return info.Env ().Undefined ();
248
276
}
249
277
250
- return Napi::Number::From (info. Env () , llama_token_eos (model));
278
+ return getNapiControlToken (info, model , llama_token_eos (model));
251
279
}
252
280
Napi::Value TokenNl (const Napi::CallbackInfo& info) {
253
281
if (disposed) {
254
282
Napi::Error::New (info.Env (), " Context is disposed" ).ThrowAsJavaScriptException ();
255
283
return info.Env ().Undefined ();
256
284
}
257
285
258
- return Napi::Number::From (info. Env () , llama_token_nl (model));
286
+ return getNapiToken (info, model , llama_token_nl (model));
259
287
}
260
288
Napi::Value PrefixToken (const Napi::CallbackInfo& info) {
261
289
if (disposed) {
262
290
Napi::Error::New (info.Env (), " Context is disposed" ).ThrowAsJavaScriptException ();
263
291
return info.Env ().Undefined ();
264
292
}
265
293
266
- return Napi::Number::From (info. Env () , llama_token_prefix (model));
294
+ return getNapiControlToken (info, model , llama_token_prefix (model));
267
295
}
268
296
Napi::Value MiddleToken (const Napi::CallbackInfo& info) {
269
297
if (disposed) {
270
298
Napi::Error::New (info.Env (), " Context is disposed" ).ThrowAsJavaScriptException ();
271
299
return info.Env ().Undefined ();
272
300
}
273
301
274
- return Napi::Number::From (info. Env () , llama_token_middle (model));
302
+ return getNapiControlToken (info, model , llama_token_middle (model));
275
303
}
276
304
Napi::Value SuffixToken (const Napi::CallbackInfo& info) {
277
305
if (disposed) {
278
306
Napi::Error::New (info.Env (), " Context is disposed" ).ThrowAsJavaScriptException ();
279
307
return info.Env ().Undefined ();
280
308
}
281
309
282
- return Napi::Number::From (info. Env () , llama_token_suffix (model));
310
+ return getNapiControlToken (info, model , llama_token_suffix (model));
283
311
}
284
312
Napi::Value EotToken (const Napi::CallbackInfo& info) {
285
313
if (disposed) {
286
314
Napi::Error::New (info.Env (), " Context is disposed" ).ThrowAsJavaScriptException ();
287
315
return info.Env ().Undefined ();
288
316
}
289
317
290
- return Napi::Number::From (info. Env () , llama_token_eot (model));
318
+ return getNapiControlToken (info, model , llama_token_eot (model));
291
319
}
292
320
Napi::Value GetTokenString (const Napi::CallbackInfo& info) {
293
321
if (disposed) {
@@ -308,6 +336,29 @@ class AddonModel : public Napi::ObjectWrap<AddonModel> {
308
336
return Napi::String::New (info.Env (), ss.str ());
309
337
}
310
338
339
+ Napi::Value GetTokenType (const Napi::CallbackInfo& info) {
340
+ if (disposed) {
341
+ Napi::Error::New (info.Env (), " Context is disposed" ).ThrowAsJavaScriptException ();
342
+ return info.Env ().Undefined ();
343
+ }
344
+
345
+ if (info[0 ].IsNumber () == false ) {
346
+ return Napi::Number::From (info.Env (), int32_t (LLAMA_TOKEN_TYPE_UNDEFINED));
347
+ }
348
+
349
+ int token = info[0 ].As <Napi::Number>().Int32Value ();
350
+ auto tokenType = llama_token_get_type (model, token);
351
+
352
+ return Napi::Number::From (info.Env (), int32_t (tokenType));
353
+ }
354
+ Napi::Value ShouldPrependBosToken (const Napi::CallbackInfo& info) {
355
+ const int addBos = llama_add_bos_token (model);
356
+
357
+ bool shouldPrependBos = addBos != -1 ? bool (addBos) : (llama_vocab_type (model) == LLAMA_VOCAB_TYPE_SPM);
358
+
359
+ return Napi::Boolean::New (info.Env (), shouldPrependBos);
360
+ }
361
+
311
362
static void init (Napi::Object exports) {
312
363
exports.Set (
313
364
" AddonModel" ,
@@ -318,6 +369,7 @@ class AddonModel : public Napi::ObjectWrap<AddonModel> {
318
369
InstanceMethod (" tokenize" , &AddonModel::Tokenize),
319
370
InstanceMethod (" detokenize" , &AddonModel::Detokenize),
320
371
InstanceMethod (" getTrainContextSize" , &AddonModel::GetTrainContextSize),
372
+ InstanceMethod (" getEmbeddingVectorSize" , &AddonModel::GetEmbeddingVectorSize),
321
373
InstanceMethod (" getTotalSize" , &AddonModel::GetTotalSize),
322
374
InstanceMethod (" getTotalParameters" , &AddonModel::GetTotalParameters),
323
375
InstanceMethod (" getModelDescription" , &AddonModel::GetModelDescription),
@@ -329,6 +381,8 @@ class AddonModel : public Napi::ObjectWrap<AddonModel> {
329
381
InstanceMethod (" suffixToken" , &AddonModel::SuffixToken),
330
382
InstanceMethod (" eotToken" , &AddonModel::EotToken),
331
383
InstanceMethod (" getTokenString" , &AddonModel::GetTokenString),
384
+ InstanceMethod (" getTokenType" , &AddonModel::GetTokenType),
385
+ InstanceMethod (" shouldPrependBosToken" , &AddonModel::ShouldPrependBosToken),
332
386
InstanceMethod (" dispose" , &AddonModel::Dispose),
333
387
}
334
388
)
@@ -993,7 +1047,7 @@ Napi::Value setLoggerLogLevel(const Napi::CallbackInfo& info) {
993
1047
}
994
1048
995
1049
Napi::Object registerCallback (Napi::Env env, Napi::Object exports) {
996
- llama_backend_init (false );
1050
+ llama_backend_init ();
997
1051
exports.DefineProperties ({
998
1052
Napi::PropertyDescriptor::Function (" systemInfo" , systemInfo),
999
1053
Napi::PropertyDescriptor::Function (" setLogger" , setLogger),
0 commit comments