node-llama-cpp 3.0.0-beta.38 → 3.0.0-beta.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/bins/linux-arm64/_nlcBuildMetadata.json +1 -1
  2. package/bins/linux-arm64/libggml.so +0 -0
  3. package/bins/linux-arm64/libllama.so +0 -0
  4. package/bins/linux-arm64/llama-addon.node +0 -0
  5. package/bins/linux-armv7l/_nlcBuildMetadata.json +1 -1
  6. package/bins/linux-armv7l/libggml.so +0 -0
  7. package/bins/linux-armv7l/libllama.so +0 -0
  8. package/bins/linux-armv7l/llama-addon.node +0 -0
  9. package/bins/linux-x64/_nlcBuildMetadata.json +1 -1
  10. package/bins/linux-x64/libggml.so +0 -0
  11. package/bins/linux-x64/libllama.so +0 -0
  12. package/bins/linux-x64/llama-addon.node +0 -0
  13. package/bins/linux-x64-vulkan/_nlcBuildMetadata.json +1 -1
  14. package/bins/linux-x64-vulkan/libggml.so +0 -0
  15. package/bins/linux-x64-vulkan/libllama.so +0 -0
  16. package/bins/linux-x64-vulkan/llama-addon.node +0 -0
  17. package/bins/linux-x64-vulkan/vulkan-shaders-gen +0 -0
  18. package/bins/mac-arm64-metal/_nlcBuildMetadata.json +1 -1
  19. package/bins/mac-arm64-metal/ggml-common.h +24 -0
  20. package/bins/mac-arm64-metal/ggml-metal.metal +181 -552
  21. package/bins/mac-arm64-metal/libggml.dylib +0 -0
  22. package/bins/mac-arm64-metal/libllama.dylib +0 -0
  23. package/bins/mac-arm64-metal/llama-addon.node +0 -0
  24. package/bins/mac-x64/_nlcBuildMetadata.json +1 -1
  25. package/bins/mac-x64/libggml.dylib +0 -0
  26. package/bins/mac-x64/libllama.dylib +0 -0
  27. package/bins/mac-x64/llama-addon.node +0 -0
  28. package/bins/win-arm64/_nlcBuildMetadata.json +1 -1
  29. package/bins/win-arm64/ggml.dll +0 -0
  30. package/bins/win-arm64/llama-addon.exp +0 -0
  31. package/bins/win-arm64/llama-addon.lib +0 -0
  32. package/bins/win-arm64/llama-addon.node +0 -0
  33. package/bins/win-arm64/llama.dll +0 -0
  34. package/bins/win-x64/_nlcBuildMetadata.json +1 -1
  35. package/bins/win-x64/ggml.dll +0 -0
  36. package/bins/win-x64/llama-addon.node +0 -0
  37. package/bins/win-x64/llama.dll +0 -0
  38. package/bins/win-x64-vulkan/_nlcBuildMetadata.json +1 -1
  39. package/bins/win-x64-vulkan/ggml.dll +0 -0
  40. package/bins/win-x64-vulkan/llama-addon.node +0 -0
  41. package/bins/win-x64-vulkan/llama.dll +0 -0
  42. package/bins/win-x64-vulkan/vulkan-shaders-gen.exe +0 -0
  43. package/dist/ChatWrapper.d.ts +2 -1
  44. package/dist/ChatWrapper.js +19 -5
  45. package/dist/ChatWrapper.js.map +1 -1
  46. package/dist/bindings/AddonTypes.d.ts +13 -2
  47. package/dist/bindings/getLlama.d.ts +3 -2
  48. package/dist/bindings/getLlama.js +1 -1
  49. package/dist/bindings/getLlama.js.map +1 -1
  50. package/dist/chatWrappers/FunctionaryChatWrapper.js +8 -5
  51. package/dist/chatWrappers/FunctionaryChatWrapper.js.map +1 -1
  52. package/dist/chatWrappers/GemmaChatWrapper.js +1 -1
  53. package/dist/chatWrappers/GemmaChatWrapper.js.map +1 -1
  54. package/dist/chatWrappers/Llama3ChatWrapper.js +3 -4
  55. package/dist/chatWrappers/Llama3ChatWrapper.js.map +1 -1
  56. package/dist/chatWrappers/Llama3_1ChatWrapper.d.ts +31 -0
  57. package/dist/chatWrappers/Llama3_1ChatWrapper.js +223 -0
  58. package/dist/chatWrappers/Llama3_1ChatWrapper.js.map +1 -0
  59. package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.d.ts +17 -2
  60. package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.js +39 -2
  61. package/dist/chatWrappers/utils/ChatModelFunctionsDocumentationGenerator.js.map +1 -1
  62. package/dist/chatWrappers/utils/jsonDumps.d.ts +7 -0
  63. package/dist/chatWrappers/utils/jsonDumps.js +18 -0
  64. package/dist/chatWrappers/utils/jsonDumps.js.map +1 -0
  65. package/dist/chatWrappers/utils/resolveChatWrapper.d.ts +5 -3
  66. package/dist/chatWrappers/utils/resolveChatWrapper.js +50 -4
  67. package/dist/chatWrappers/utils/resolveChatWrapper.js.map +1 -1
  68. package/dist/cli/commands/ChatCommand.d.ts +1 -1
  69. package/dist/cli/commands/ChatCommand.js +2 -4
  70. package/dist/cli/commands/ChatCommand.js.map +1 -1
  71. package/dist/cli/commands/CompleteCommand.js +2 -2
  72. package/dist/cli/commands/CompleteCommand.js.map +1 -1
  73. package/dist/cli/commands/InfillCommand.js +2 -2
  74. package/dist/cli/commands/InfillCommand.js.map +1 -1
  75. package/dist/cli/recommendedModels.js +43 -24
  76. package/dist/cli/recommendedModels.js.map +1 -1
  77. package/dist/consts.d.ts +1 -0
  78. package/dist/consts.js +1 -0
  79. package/dist/consts.js.map +1 -1
  80. package/dist/evaluator/LlamaChat/LlamaChat.d.ts +22 -0
  81. package/dist/evaluator/LlamaChat/LlamaChat.js +65 -34
  82. package/dist/evaluator/LlamaChat/LlamaChat.js.map +1 -1
  83. package/dist/evaluator/LlamaChatSession/LlamaChatSession.d.ts +28 -6
  84. package/dist/evaluator/LlamaChatSession/LlamaChatSession.js +22 -16
  85. package/dist/evaluator/LlamaChatSession/LlamaChatSession.js.map +1 -1
  86. package/dist/evaluator/LlamaChatSession/utils/LlamaChatSessionPromptCompletionEngine.js +4 -5
  87. package/dist/evaluator/LlamaChatSession/utils/LlamaChatSessionPromptCompletionEngine.js.map +1 -1
  88. package/dist/evaluator/LlamaCompletion.d.ts +13 -2
  89. package/dist/evaluator/LlamaCompletion.js +10 -5
  90. package/dist/evaluator/LlamaCompletion.js.map +1 -1
  91. package/dist/evaluator/LlamaContext/LlamaContext.d.ts +1 -1
  92. package/dist/evaluator/LlamaContext/LlamaContext.js +60 -0
  93. package/dist/evaluator/LlamaContext/LlamaContext.js.map +1 -1
  94. package/dist/evaluator/LlamaContext/types.d.ts +21 -0
  95. package/dist/evaluator/LlamaGrammar.d.ts +6 -3
  96. package/dist/evaluator/LlamaGrammar.js +2 -2
  97. package/dist/evaluator/LlamaGrammar.js.map +1 -1
  98. package/dist/evaluator/LlamaModel/LlamaModel.d.ts +16 -32
  99. package/dist/evaluator/LlamaModel/LlamaModel.js +94 -53
  100. package/dist/evaluator/LlamaModel/LlamaModel.js.map +1 -1
  101. package/dist/gguf/consts.d.ts +1 -0
  102. package/dist/gguf/consts.js +4 -0
  103. package/dist/gguf/consts.js.map +1 -1
  104. package/dist/gguf/insights/GgufInsights.js +4 -0
  105. package/dist/gguf/insights/GgufInsights.js.map +1 -1
  106. package/dist/gguf/parser/GgufV2Parser.js +3 -1
  107. package/dist/gguf/parser/GgufV2Parser.js.map +1 -1
  108. package/dist/gguf/types/GgufMetadataTypes.d.ts +16 -0
  109. package/dist/gguf/types/GgufMetadataTypes.js.map +1 -1
  110. package/dist/gguf/utils/convertMetadataKeyValueRecordToNestedObject.d.ts +3 -2
  111. package/dist/gguf/utils/convertMetadataKeyValueRecordToNestedObject.js +44 -8
  112. package/dist/gguf/utils/convertMetadataKeyValueRecordToNestedObject.js.map +1 -1
  113. package/dist/index.d.ts +4 -2
  114. package/dist/index.js +3 -1
  115. package/dist/index.js.map +1 -1
  116. package/dist/types.d.ts +15 -1
  117. package/dist/types.js.map +1 -1
  118. package/dist/utils/DeepPartialObject.d.ts +3 -0
  119. package/dist/utils/DeepPartialObject.js +2 -0
  120. package/dist/utils/DeepPartialObject.js.map +1 -0
  121. package/dist/utils/StopGenerationDetector.d.ts +6 -3
  122. package/dist/utils/StopGenerationDetector.js +22 -7
  123. package/dist/utils/StopGenerationDetector.js.map +1 -1
  124. package/dist/utils/TokenStreamRegulator.d.ts +1 -0
  125. package/dist/utils/TokenStreamRegulator.js +23 -5
  126. package/dist/utils/TokenStreamRegulator.js.map +1 -1
  127. package/dist/utils/resolveLastTokens.d.ts +2 -0
  128. package/dist/utils/resolveLastTokens.js +12 -0
  129. package/dist/utils/resolveLastTokens.js.map +1 -0
  130. package/llama/CMakeLists.txt +1 -1
  131. package/llama/addon/AddonContext.cpp +772 -0
  132. package/llama/addon/AddonContext.h +53 -0
  133. package/llama/addon/AddonGrammar.cpp +44 -0
  134. package/llama/addon/AddonGrammar.h +18 -0
  135. package/llama/addon/AddonGrammarEvaluationState.cpp +28 -0
  136. package/llama/addon/AddonGrammarEvaluationState.h +15 -0
  137. package/llama/addon/AddonModel.cpp +681 -0
  138. package/llama/addon/AddonModel.h +61 -0
  139. package/llama/addon/AddonModelData.cpp +25 -0
  140. package/llama/addon/AddonModelData.h +15 -0
  141. package/llama/addon/AddonModelLora.cpp +107 -0
  142. package/llama/addon/AddonModelLora.h +28 -0
  143. package/llama/addon/addon.cpp +217 -0
  144. package/llama/addon/addonGlobals.cpp +22 -0
  145. package/llama/addon/addonGlobals.h +12 -0
  146. package/llama/addon/globals/addonLog.cpp +135 -0
  147. package/llama/addon/globals/addonLog.h +21 -0
  148. package/llama/addon/globals/addonProgress.cpp +15 -0
  149. package/llama/addon/globals/addonProgress.h +15 -0
  150. package/llama/addon/globals/getGpuInfo.cpp +108 -0
  151. package/llama/addon/globals/getGpuInfo.h +6 -0
  152. package/llama/binariesGithubRelease.json +1 -1
  153. package/llama/gitRelease.bundle +0 -0
  154. package/llama/grammars/README.md +1 -1
  155. package/llama/llama.cpp.info.json +1 -1
  156. package/package.json +3 -3
  157. package/templates/packed/electron-typescript-react.json +1 -1
  158. package/templates/packed/node-typescript.json +1 -1
  159. package/llama/addon.cpp +0 -1997
@@ -0,0 +1,61 @@
1
+ #pragma once
2
+ #include "llama.h"
3
+ #include "napi.h"
4
+ #include "addonGlobals.h"
5
+ #include "globals/addonProgress.h"
6
+
7
+ class AddonModel : public Napi::ObjectWrap<AddonModel> {
8
+ public:
9
+ llama_model_params model_params;
10
+ std::vector<llama_model_kv_override> kv_overrides;
11
+ llama_model* model;
12
+ uint64_t loadedModelSize;
13
+ Napi::Reference<Napi::Object> addonExportsRef;
14
+ bool hasAddonExportsRef;
15
+ AddonModelData* data;
16
+
17
+ std::string modelPath;
18
+ bool modelLoaded;
19
+ bool abortModelLoad;
20
+ bool model_load_stopped;
21
+ float rawModelLoadPercentage;
22
+ unsigned modelLoadPercentage;
23
+ AddonThreadSafeProgressEventCallbackFunction addonThreadSafeOnLoadProgressEventCallback;
24
+ bool onLoadProgressEventCallbackSet;
25
+ bool hasLoadAbortSignal;
26
+
27
+ bool disposed;
28
+
29
+ AddonModel(const Napi::CallbackInfo& info);
30
+ ~AddonModel();
31
+ void dispose();
32
+
33
+ Napi::Value Init(const Napi::CallbackInfo& info);
34
+ Napi::Value LoadLora(const Napi::CallbackInfo& info);
35
+ Napi::Value AbortActiveModelLoad(const Napi::CallbackInfo& info);
36
+ Napi::Value Dispose(const Napi::CallbackInfo& info);
37
+ Napi::Value Tokenize(const Napi::CallbackInfo& info);
38
+ Napi::Value Detokenize(const Napi::CallbackInfo& info);
39
+ Napi::Value GetTrainContextSize(const Napi::CallbackInfo& info);
40
+ Napi::Value GetEmbeddingVectorSize(const Napi::CallbackInfo& info);
41
+ Napi::Value GetTotalSize(const Napi::CallbackInfo& info);
42
+ Napi::Value GetTotalParameters(const Napi::CallbackInfo& info);
43
+ Napi::Value GetModelDescription(const Napi::CallbackInfo& info);
44
+
45
+ Napi::Value TokenBos(const Napi::CallbackInfo& info);
46
+ Napi::Value TokenEos(const Napi::CallbackInfo& info);
47
+ Napi::Value TokenNl(const Napi::CallbackInfo& info);
48
+ Napi::Value PrefixToken(const Napi::CallbackInfo& info);
49
+ Napi::Value MiddleToken(const Napi::CallbackInfo& info);
50
+ Napi::Value SuffixToken(const Napi::CallbackInfo& info);
51
+ Napi::Value EotToken(const Napi::CallbackInfo& info);
52
+ Napi::Value GetTokenString(const Napi::CallbackInfo& info);
53
+
54
+ Napi::Value GetTokenAttributes(const Napi::CallbackInfo& info);
55
+ Napi::Value IsEogToken(const Napi::CallbackInfo& info);
56
+ Napi::Value GetVocabularyType(const Napi::CallbackInfo& info);
57
+ Napi::Value ShouldPrependBosToken(const Napi::CallbackInfo& info);
58
+ Napi::Value GetModelSize(const Napi::CallbackInfo& info);
59
+
60
+ static void init(Napi::Object exports);
61
+ };
@@ -0,0 +1,25 @@
1
+ #include <iostream>
2
+
3
+ #include "addonGlobals.h"
4
+ #include "AddonModelData.h"
5
+ #include "AddonModelLora.h"
6
+
7
+ AddonModelData::AddonModelData() {
8
+
9
+ }
10
+ AddonModelData::~AddonModelData() {
11
+ std::set<AddonModelLora *> currentLoraAdapters;
12
+ currentLoraAdapters.swap(loraAdapters);
13
+
14
+ for (auto lora : currentLoraAdapters) {
15
+ lora->dispose(true);
16
+ }
17
+ currentLoraAdapters.clear();
18
+ }
19
+
20
+ void AddonModelData::removeLora(AddonModelLora* lora) {
21
+ auto pos = loraAdapters.find(lora);
22
+ if (pos != loraAdapters.end()) {
23
+ loraAdapters.erase(pos);
24
+ }
25
+ }
@@ -0,0 +1,15 @@
1
+ #pragma once
2
+ #include <set>
3
+ #include "llama.h"
4
+ #include "napi.h"
5
+ #include "addonGlobals.h"
6
+
7
+ class AddonModelData {
8
+ public:
9
+ std::set<AddonModelLora *> loraAdapters;
10
+
11
+ AddonModelData();
12
+ ~AddonModelData();
13
+
14
+ void removeLora(AddonModelLora* lora);
15
+ };
@@ -0,0 +1,107 @@
1
+ #include "addonGlobals.h"
2
+ #include "AddonModel.h"
3
+ #include "AddonModelData.h"
4
+ #include "AddonModelLora.h"
5
+
6
+ class AddonModelLoraUnloadLoraWorker : public Napi::AsyncWorker {
7
+ public:
8
+ AddonModelLora* addonLora;
9
+
10
+ AddonModelLoraUnloadLoraWorker(const Napi::Env& env, AddonModelLora* addonLora)
11
+ : Napi::AsyncWorker(env, "AddonModelLoraUnloadLoraWorker"),
12
+ addonLora(addonLora),
13
+ deferred(Napi::Promise::Deferred::New(env)) {
14
+ addonLora->Ref();
15
+ }
16
+ ~AddonModelLoraUnloadLoraWorker() {
17
+ addonLora->Unref();
18
+ }
19
+
20
+ Napi::Promise GetPromise() {
21
+ return deferred.Promise();
22
+ }
23
+
24
+ protected:
25
+ Napi::Promise::Deferred deferred;
26
+
27
+ void Execute() {
28
+ try {
29
+ addonLora->dispose();
30
+ } catch (const std::exception& e) {
31
+ SetError(e.what());
32
+ } catch(...) {
33
+ SetError("Unknown error when calling \"llama_lora_adapter_free\"");
34
+ }
35
+ }
36
+ void OnOK() {
37
+ deferred.Resolve(Env().Undefined());
38
+ }
39
+ void OnError(const Napi::Error& err) {
40
+ deferred.Reject(err.Value());
41
+ }
42
+ };
43
+
44
+ AddonModelLora::AddonModelLora(const Napi::CallbackInfo& info) : Napi::ObjectWrap<AddonModelLora>(info) {
45
+ usages = 0;
46
+
47
+ model = Napi::ObjectWrap<AddonModel>::Unwrap(info[0].As<Napi::Object>());
48
+ loraFilePath = info[1].As<Napi::String>().Utf8Value();
49
+ lora_adapter = nullptr;
50
+ }
51
+
52
+ AddonModelLora::~AddonModelLora() {
53
+ dispose();
54
+ }
55
+
56
+ void AddonModelLora::dispose(bool skipErase) {
57
+ if (lora_adapter != nullptr) {
58
+ auto loraAdapterToDispose = lora_adapter;
59
+ lora_adapter = nullptr;
60
+ llama_lora_adapter_free(loraAdapterToDispose);
61
+
62
+ if (!skipErase && model->data != nullptr) {
63
+ model->data->removeLora(this);
64
+ }
65
+
66
+ model->Unref();
67
+ }
68
+ }
69
+
70
+ Napi::Value AddonModelLora::GetFilePath(const Napi::CallbackInfo& info) {
71
+ return Napi::String::New(info.Env(), loraFilePath);
72
+ }
73
+
74
+
75
+ Napi::Value AddonModelLora::GetUsages(const Napi::CallbackInfo& info) {
76
+ return Napi::Number::From(info.Env(), usages);
77
+ }
78
+
79
+ void AddonModelLora::SetUsages(const Napi::CallbackInfo& info, const Napi::Value &value) {
80
+ usages = value.As<Napi::Number>().Uint32Value();
81
+ }
82
+
83
+ Napi::Value AddonModelLora::Dispose(const Napi::CallbackInfo& info) {
84
+ AddonModelLoraUnloadLoraWorker* worker = new AddonModelLoraUnloadLoraWorker(this->Env(), this);
85
+ worker->Queue();
86
+ return worker->GetPromise();
87
+ }
88
+
89
+ Napi::Value AddonModelLora::GetDisposed(const Napi::CallbackInfo& info) {
90
+ return Napi::Boolean::New(info.Env(), lora_adapter == nullptr);
91
+ }
92
+
93
+ void AddonModelLora::init(Napi::Object exports) {
94
+ exports.Set(
95
+ "AddonModelLora",
96
+ DefineClass(
97
+ exports.Env(),
98
+ "AddonModelLora",
99
+ {
100
+ InstanceAccessor("usages", &AddonModelLora::GetUsages, &AddonModelLora::SetUsages),
101
+ InstanceAccessor("filePath", &AddonModelLora::GetFilePath, nullptr),
102
+ InstanceAccessor("disposed", &AddonModelLora::GetDisposed, nullptr),
103
+ InstanceMethod("dispose", &AddonModelLora::Dispose),
104
+ }
105
+ )
106
+ );
107
+ }
@@ -0,0 +1,28 @@
1
+ #pragma once
2
+ #include "llama.h"
3
+ #include "napi.h"
4
+ #include "addonGlobals.h"
5
+
6
+ class AddonModelLora : public Napi::ObjectWrap<AddonModelLora> {
7
+ public:
8
+ AddonModel* model;
9
+ llama_lora_adapter * lora_adapter;
10
+ std::string loraFilePath;
11
+ uint32_t usages;
12
+
13
+ AddonModelLora(const Napi::CallbackInfo& info);
14
+ ~AddonModelLora();
15
+
16
+ void dispose(bool skipErase = false);
17
+
18
+ Napi::Value GetFilePath(const Napi::CallbackInfo& info);
19
+
20
+ Napi::Value GetUsages(const Napi::CallbackInfo& info);
21
+ void SetUsages(const Napi::CallbackInfo& info, const Napi::Value &value);
22
+
23
+ Napi::Value GetDisposed(const Napi::CallbackInfo& info);
24
+
25
+ Napi::Value Dispose(const Napi::CallbackInfo& info);
26
+
27
+ static void init(Napi::Object exports);
28
+ };
@@ -0,0 +1,217 @@
1
+ #include "addonGlobals.h"
2
+ #include "AddonModel.h"
3
+ #include "AddonModelLora.h"
4
+ #include "AddonGrammar.h"
5
+ #include "AddonGrammarEvaluationState.h"
6
+ #include "AddonContext.h"
7
+ #include "globals/addonLog.h"
8
+ #include "globals/addonProgress.h"
9
+ #include "globals/getGpuInfo.h"
10
+
11
+ bool backendInitialized = false;
12
+ bool backendDisposed = false;
13
+
14
+ Napi::Value systemInfo(const Napi::CallbackInfo& info) {
15
+ return Napi::String::From(info.Env(), llama_print_system_info());
16
+ }
17
+
18
+ Napi::Value addonGetSupportsGpuOffloading(const Napi::CallbackInfo& info) {
19
+ return Napi::Boolean::New(info.Env(), llama_supports_gpu_offload());
20
+ }
21
+
22
+ Napi::Value addonGetSupportsMmap(const Napi::CallbackInfo& info) {
23
+ return Napi::Boolean::New(info.Env(), llama_supports_mmap());
24
+ }
25
+
26
+ Napi::Value addonGetSupportsMlock(const Napi::CallbackInfo& info) {
27
+ return Napi::Boolean::New(info.Env(), llama_supports_mlock());
28
+ }
29
+
30
+ Napi::Value addonGetBlockSizeForGgmlType(const Napi::CallbackInfo& info) {
31
+ const int ggmlType = info[0].As<Napi::Number>().Int32Value();
32
+
33
+ if (ggmlType < 0 || ggmlType > GGML_TYPE_COUNT) {
34
+ return info.Env().Undefined();
35
+ }
36
+
37
+ const auto blockSize = ggml_blck_size(static_cast<ggml_type>(ggmlType));
38
+
39
+ return Napi::Number::New(info.Env(), blockSize);
40
+ }
41
+
42
+ Napi::Value addonGetTypeSizeForGgmlType(const Napi::CallbackInfo& info) {
43
+ const int ggmlType = info[0].As<Napi::Number>().Int32Value();
44
+
45
+ if (ggmlType < 0 || ggmlType > GGML_TYPE_COUNT) {
46
+ return info.Env().Undefined();
47
+ }
48
+
49
+ const auto typeSize = ggml_type_size(static_cast<ggml_type>(ggmlType));
50
+
51
+ return Napi::Number::New(info.Env(), typeSize);
52
+ }
53
+
54
+ Napi::Value addonGetConsts(const Napi::CallbackInfo& info) {
55
+ Napi::Object consts = Napi::Object::New(info.Env());
56
+ consts.Set("ggmlMaxDims", Napi::Number::New(info.Env(), GGML_MAX_DIMS));
57
+ consts.Set("ggmlTypeF16Size", Napi::Number::New(info.Env(), ggml_type_size(GGML_TYPE_F16)));
58
+ consts.Set("ggmlTypeF32Size", Napi::Number::New(info.Env(), ggml_type_size(GGML_TYPE_F32)));
59
+ consts.Set("ggmlTensorOverhead", Napi::Number::New(info.Env(), ggml_tensor_overhead()));
60
+ consts.Set("llamaMaxRngState", Napi::Number::New(info.Env(), LLAMA_MAX_RNG_STATE));
61
+ consts.Set("llamaPosSize", Napi::Number::New(info.Env(), sizeof(llama_pos)));
62
+ consts.Set("llamaSeqIdSize", Napi::Number::New(info.Env(), sizeof(llama_seq_id)));
63
+
64
+ return consts;
65
+ }
66
+
67
+ class AddonBackendLoadWorker : public Napi::AsyncWorker {
68
+ public:
69
+ AddonBackendLoadWorker(const Napi::Env& env)
70
+ : Napi::AsyncWorker(env, "AddonBackendLoadWorker"),
71
+ deferred(Napi::Promise::Deferred::New(env)) {
72
+ }
73
+ ~AddonBackendLoadWorker() {
74
+ }
75
+
76
+ Napi::Promise GetPromise() {
77
+ return deferred.Promise();
78
+ }
79
+
80
+ protected:
81
+ Napi::Promise::Deferred deferred;
82
+
83
+ void Execute() {
84
+ try {
85
+ llama_backend_init();
86
+
87
+ try {
88
+ if (backendDisposed) {
89
+ llama_backend_free();
90
+ } else {
91
+ backendInitialized = true;
92
+ }
93
+ } catch (const std::exception& e) {
94
+ SetError(e.what());
95
+ } catch(...) {
96
+ SetError("Unknown error when calling \"llama_backend_free\"");
97
+ }
98
+ } catch (const std::exception& e) {
99
+ SetError(e.what());
100
+ } catch(...) {
101
+ SetError("Unknown error when calling \"llama_backend_init\"");
102
+ }
103
+ }
104
+ void OnOK() {
105
+ deferred.Resolve(Env().Undefined());
106
+ }
107
+ void OnError(const Napi::Error& err) {
108
+ deferred.Reject(err.Value());
109
+ }
110
+ };
111
+
112
+
113
+ class AddonBackendUnloadWorker : public Napi::AsyncWorker {
114
+ public:
115
+ AddonBackendUnloadWorker(const Napi::Env& env)
116
+ : Napi::AsyncWorker(env, "AddonBackendUnloadWorker"),
117
+ deferred(Napi::Promise::Deferred::New(env)) {
118
+ }
119
+ ~AddonBackendUnloadWorker() {
120
+ }
121
+
122
+ Napi::Promise GetPromise() {
123
+ return deferred.Promise();
124
+ }
125
+
126
+ protected:
127
+ Napi::Promise::Deferred deferred;
128
+
129
+ void Execute() {
130
+ try {
131
+ if (backendInitialized) {
132
+ backendInitialized = false;
133
+ llama_backend_free();
134
+ }
135
+ } catch (const std::exception& e) {
136
+ SetError(e.what());
137
+ } catch(...) {
138
+ SetError("Unknown error when calling \"llama_backend_free\"");
139
+ }
140
+ }
141
+ void OnOK() {
142
+ deferred.Resolve(Env().Undefined());
143
+ }
144
+ void OnError(const Napi::Error& err) {
145
+ deferred.Reject(err.Value());
146
+ }
147
+ };
148
+
149
+ Napi::Value addonInit(const Napi::CallbackInfo& info) {
150
+ if (backendInitialized) {
151
+ Napi::Promise::Deferred deferred = Napi::Promise::Deferred::New(info.Env());
152
+ deferred.Resolve(info.Env().Undefined());
153
+ return deferred.Promise();
154
+ }
155
+
156
+ AddonBackendLoadWorker* worker = new AddonBackendLoadWorker(info.Env());
157
+ worker->Queue();
158
+ return worker->GetPromise();
159
+ }
160
+
161
+ Napi::Value addonDispose(const Napi::CallbackInfo& info) {
162
+ if (backendDisposed) {
163
+ Napi::Promise::Deferred deferred = Napi::Promise::Deferred::New(info.Env());
164
+ deferred.Resolve(info.Env().Undefined());
165
+ return deferred.Promise();
166
+ }
167
+
168
+ backendDisposed = true;
169
+
170
+ AddonBackendUnloadWorker* worker = new AddonBackendUnloadWorker(info.Env());
171
+ worker->Queue();
172
+ return worker->GetPromise();
173
+ }
174
+
175
+ static void addonFreeLlamaBackend(Napi::Env env, int* data) {
176
+ if (backendDisposed) {
177
+ return;
178
+ }
179
+
180
+ backendDisposed = true;
181
+ if (backendInitialized) {
182
+ backendInitialized = false;
183
+ llama_backend_free();
184
+ }
185
+ }
186
+
187
+ Napi::Object registerCallback(Napi::Env env, Napi::Object exports) {
188
+ exports.DefineProperties({
189
+ Napi::PropertyDescriptor::Function("systemInfo", systemInfo),
190
+ Napi::PropertyDescriptor::Function("getSupportsGpuOffloading", addonGetSupportsGpuOffloading),
191
+ Napi::PropertyDescriptor::Function("getSupportsMmap", addonGetSupportsMmap),
192
+ Napi::PropertyDescriptor::Function("getSupportsMlock", addonGetSupportsMlock),
193
+ Napi::PropertyDescriptor::Function("getBlockSizeForGgmlType", addonGetBlockSizeForGgmlType),
194
+ Napi::PropertyDescriptor::Function("getTypeSizeForGgmlType", addonGetTypeSizeForGgmlType),
195
+ Napi::PropertyDescriptor::Function("getConsts", addonGetConsts),
196
+ Napi::PropertyDescriptor::Function("setLogger", setLogger),
197
+ Napi::PropertyDescriptor::Function("setLoggerLogLevel", setLoggerLogLevel),
198
+ Napi::PropertyDescriptor::Function("getGpuVramInfo", getGpuVramInfo),
199
+ Napi::PropertyDescriptor::Function("getGpuDeviceInfo", getGpuDeviceInfo),
200
+ Napi::PropertyDescriptor::Function("getGpuType", getGpuType),
201
+ Napi::PropertyDescriptor::Function("init", addonInit),
202
+ Napi::PropertyDescriptor::Function("dispose", addonDispose),
203
+ });
204
+ AddonModel::init(exports);
205
+ AddonModelLora::init(exports);
206
+ AddonGrammar::init(exports);
207
+ AddonGrammarEvaluationState::init(exports);
208
+ AddonContext::init(exports);
209
+
210
+ llama_log_set(addonLlamaCppLogCallback, nullptr);
211
+
212
+ exports.AddFinalizer(addonFreeLlamaBackend, static_cast<int*>(nullptr));
213
+
214
+ return exports;
215
+ }
216
+
217
+ NODE_API_MODULE(NODE_GYP_MODULE_NAME, registerCallback)
@@ -0,0 +1,22 @@
1
+ #include <sstream>
2
+ #include <vector>
3
+ #include "addonGlobals.h"
4
+ #include "napi.h"
5
+
6
+ void adjustNapiExternalMemoryAdd(Napi::Env env, uint64_t size) {
7
+ const uint64_t chunkSize = std::numeric_limits<int64_t>::max();
8
+ while (size > 0) {
9
+ int64_t adjustSize = std::min(size, chunkSize);
10
+ Napi::MemoryManagement::AdjustExternalMemory(env, adjustSize);
11
+ size -= adjustSize;
12
+ }
13
+ }
14
+
15
+ void adjustNapiExternalMemorySubtract(Napi::Env env, uint64_t size) {
16
+ const uint64_t chunkSize = std::numeric_limits<int64_t>::max();
17
+ while (size > 0) {
18
+ int64_t adjustSize = std::min(size, chunkSize);
19
+ Napi::MemoryManagement::AdjustExternalMemory(env, -adjustSize);
20
+ size -= adjustSize;
21
+ }
22
+ }
@@ -0,0 +1,12 @@
1
+ #pragma once
2
+ #include "napi.h"
3
+
4
+ class AddonModel;
5
+ class AddonModelLora;
6
+ class AddonModelData;
7
+ class AddonContext;
8
+ class AddonGrammar;
9
+ class AddonGrammarEvaluationState;
10
+
11
+ void adjustNapiExternalMemoryAdd(Napi::Env env, uint64_t size);
12
+ void adjustNapiExternalMemorySubtract(Napi::Env env, uint64_t size);
@@ -0,0 +1,135 @@
1
+ #include <sstream>
2
+
3
+ #include "addonLog.h"
4
+
5
+ AddonThreadSafeLogCallbackFunction addonThreadSafeLoggerCallback;
6
+ bool addonJsLoggerCallbackSet = false;
7
+ int addonLoggerLogLevel = 5;
8
+
9
+ static int addonGetGgmlLogLevelNumber(ggml_log_level level) {
10
+ switch (level) {
11
+ case GGML_LOG_LEVEL_ERROR: return 2;
12
+ case GGML_LOG_LEVEL_WARN: return 3;
13
+ case GGML_LOG_LEVEL_INFO: return 4;
14
+ case GGML_LOG_LEVEL_DEBUG: return 5;
15
+ }
16
+
17
+ return 1;
18
+ }
19
+
20
+ void addonCallJsLogCallback(
21
+ Napi::Env env, Napi::Function callback, AddonThreadSafeLogCallbackFunctionContext* context, addon_logger_log* data
22
+ ) {
23
+ bool called = false;
24
+
25
+ if (env != nullptr && callback != nullptr && addonJsLoggerCallbackSet) {
26
+ try {
27
+ callback.Call({
28
+ Napi::Number::New(env, data->logLevelNumber),
29
+ Napi::String::New(env, data->stringStream->str()),
30
+ });
31
+ called = true;
32
+ } catch (const Napi::Error& e) {
33
+ called = false;
34
+ }
35
+ }
36
+
37
+ if (!called && data != nullptr) {
38
+ if (data->logLevelNumber == 2) {
39
+ fputs(data->stringStream->str().c_str(), stderr);
40
+ fflush(stderr);
41
+ } else {
42
+ fputs(data->stringStream->str().c_str(), stdout);
43
+ fflush(stdout);
44
+ }
45
+ }
46
+
47
+ if (data != nullptr) {
48
+ delete data->stringStream;
49
+ delete data;
50
+ }
51
+ }
52
+
53
+ void addonLlamaCppLogCallback(ggml_log_level level, const char* text, void* user_data) {
54
+ int logLevelNumber = addonGetGgmlLogLevelNumber(level);
55
+
56
+ if (logLevelNumber > addonLoggerLogLevel) {
57
+ return;
58
+ }
59
+
60
+ if (addonJsLoggerCallbackSet) {
61
+ std::stringstream* stringStream = new std::stringstream();
62
+ if (text != nullptr) {
63
+ *stringStream << text;
64
+ }
65
+
66
+ addon_logger_log* data = new addon_logger_log {
67
+ logLevelNumber,
68
+ stringStream,
69
+ };
70
+
71
+ auto status = addonThreadSafeLoggerCallback.NonBlockingCall(data);
72
+
73
+ if (status == napi_ok) {
74
+ return;
75
+ } else {
76
+ delete stringStream;
77
+ delete data;
78
+ }
79
+ }
80
+
81
+ if (text != nullptr) {
82
+ if (level == 2) {
83
+ fputs(text, stderr);
84
+ fflush(stderr);
85
+ } else {
86
+ fputs(text, stdout);
87
+ fflush(stdout);
88
+ }
89
+ }
90
+ }
91
+
92
+ Napi::Value setLogger(const Napi::CallbackInfo& info) {
93
+ if (info.Length() < 1 || !info[0].IsFunction()) {
94
+ if (addonJsLoggerCallbackSet) {
95
+ addonJsLoggerCallbackSet = false;
96
+ addonThreadSafeLoggerCallback.Release();
97
+ }
98
+
99
+ return info.Env().Undefined();
100
+ }
101
+
102
+ auto addonLoggerJSCallback = info[0].As<Napi::Function>();
103
+ AddonThreadSafeLogCallbackFunctionContext* context = new Napi::Reference<Napi::Value>(Napi::Persistent(info.This()));
104
+ addonThreadSafeLoggerCallback = AddonThreadSafeLogCallbackFunction::New(
105
+ info.Env(),
106
+ addonLoggerJSCallback,
107
+ "loggerCallback",
108
+ 0,
109
+ 1,
110
+ context,
111
+ [](Napi::Env, void*, AddonThreadSafeLogCallbackFunctionContext* ctx) {
112
+ addonJsLoggerCallbackSet = false;
113
+
114
+ delete ctx;
115
+ }
116
+ );
117
+ addonJsLoggerCallbackSet = true;
118
+
119
+ // prevent blocking the main node process from exiting due to active resources
120
+ addonThreadSafeLoggerCallback.Unref(info.Env());
121
+
122
+ return info.Env().Undefined();
123
+ }
124
+
125
+ Napi::Value setLoggerLogLevel(const Napi::CallbackInfo& info) {
126
+ if (info.Length() < 1 || !info[0].IsNumber()) {
127
+ addonLoggerLogLevel = 5;
128
+
129
+ return info.Env().Undefined();
130
+ }
131
+
132
+ addonLoggerLogLevel = info[0].As<Napi::Number>().Int32Value();
133
+
134
+ return info.Env().Undefined();
135
+ }
@@ -0,0 +1,21 @@
1
+ #pragma once
2
+ #include "llama.h"
3
+ #include "napi.h"
4
+
5
+ struct addon_logger_log {
6
+ public:
7
+ const int logLevelNumber;
8
+ const std::stringstream* stringStream;
9
+ };
10
+
11
+ void addonLlamaCppLogCallback(ggml_log_level level, const char* text, void* user_data);
12
+
13
+ using AddonThreadSafeLogCallbackFunctionContext = Napi::Reference<Napi::Value>;
14
+ void addonCallJsLogCallback(
15
+ Napi::Env env, Napi::Function callback, AddonThreadSafeLogCallbackFunctionContext* context, addon_logger_log* data
16
+ );
17
+ using AddonThreadSafeLogCallbackFunction =
18
+ Napi::TypedThreadSafeFunction<AddonThreadSafeLogCallbackFunctionContext, addon_logger_log, addonCallJsLogCallback>;
19
+
20
+ Napi::Value setLogger(const Napi::CallbackInfo& info);
21
+ Napi::Value setLoggerLogLevel(const Napi::CallbackInfo& info);
@@ -0,0 +1,15 @@
1
+ #include "addonProgress.h"
2
+
3
+ void addonCallJsProgressCallback(
4
+ Napi::Env env, Napi::Function callback, AddonThreadSafeProgressCallbackFunctionContext* context, addon_progress_event* data
5
+ ) {
6
+ if (env != nullptr && callback != nullptr) {
7
+ try {
8
+ callback.Call({Napi::Number::New(env, data->progress)});
9
+ } catch (const Napi::Error& e) {}
10
+ }
11
+
12
+ if (data != nullptr) {
13
+ delete data;
14
+ }
15
+ }
@@ -0,0 +1,15 @@
1
+ #pragma once
2
+ #include "napi.h"
3
+
4
+ struct addon_progress_event {
5
+ public:
6
+ const float progress;
7
+ };
8
+
9
+ using AddonThreadSafeProgressCallbackFunctionContext = Napi::Reference<Napi::Value>;
10
+ void addonCallJsProgressCallback(
11
+ Napi::Env env, Napi::Function callback, AddonThreadSafeProgressCallbackFunctionContext* context, addon_progress_event* data
12
+ );
13
+ using AddonThreadSafeProgressEventCallbackFunction =
14
+ Napi::TypedThreadSafeFunction<AddonThreadSafeProgressCallbackFunctionContext, addon_progress_event, addonCallJsProgressCallback>;
15
+