node-llama-cpp 3.3.2 → 3.4.1

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 (199) hide show
  1. package/README.md +3 -2
  2. package/dist/bindings/AddonTypes.d.ts +12 -4
  3. package/dist/bindings/Llama.d.ts +9 -0
  4. package/dist/bindings/Llama.js +52 -28
  5. package/dist/bindings/Llama.js.map +1 -1
  6. package/dist/bindings/getLlama.d.ts +2 -1
  7. package/dist/bindings/getLlama.js +19 -9
  8. package/dist/bindings/getLlama.js.map +1 -1
  9. package/dist/bindings/utils/asyncSome.js +2 -0
  10. package/dist/bindings/utils/asyncSome.js.map +1 -1
  11. package/dist/bindings/utils/compileLLamaCpp.d.ts +1 -1
  12. package/dist/bindings/utils/compileLLamaCpp.js +115 -34
  13. package/dist/bindings/utils/compileLLamaCpp.js.map +1 -1
  14. package/dist/bindings/utils/detectAvailableComputeLayers.d.ts +1 -0
  15. package/dist/bindings/utils/detectAvailableComputeLayers.js +4 -4
  16. package/dist/bindings/utils/detectAvailableComputeLayers.js.map +1 -1
  17. package/dist/bindings/utils/detectBuildTools.d.ts +14 -0
  18. package/dist/bindings/utils/detectBuildTools.js +149 -0
  19. package/dist/bindings/utils/detectBuildTools.js.map +1 -0
  20. package/dist/bindings/utils/resolveActualBindingBinaryPath.d.ts +1 -0
  21. package/dist/bindings/utils/resolveActualBindingBinaryPath.js +18 -0
  22. package/dist/bindings/utils/resolveActualBindingBinaryPath.js.map +1 -0
  23. package/dist/bindings/utils/testBindingBinary.d.ts +1 -1
  24. package/dist/bindings/utils/testBindingBinary.js +58 -5
  25. package/dist/bindings/utils/testBindingBinary.js.map +1 -1
  26. package/dist/chatWrappers/AlpacaChatWrapper.d.ts +4 -0
  27. package/dist/chatWrappers/AlpacaChatWrapper.js +4 -0
  28. package/dist/chatWrappers/AlpacaChatWrapper.js.map +1 -1
  29. package/dist/chatWrappers/FalconChatWrapper.d.ts +4 -0
  30. package/dist/chatWrappers/FalconChatWrapper.js +4 -0
  31. package/dist/chatWrappers/FalconChatWrapper.js.map +1 -1
  32. package/dist/chatWrappers/GeneralChatWrapper.d.ts +4 -0
  33. package/dist/chatWrappers/GeneralChatWrapper.js +4 -0
  34. package/dist/chatWrappers/GeneralChatWrapper.js.map +1 -1
  35. package/dist/chatWrappers/utils/resolveChatWrapper.d.ts +2 -0
  36. package/dist/chatWrappers/utils/resolveChatWrapper.js +8 -27
  37. package/dist/chatWrappers/utils/resolveChatWrapper.js.map +1 -1
  38. package/dist/cli/commands/ChatCommand.d.ts +4 -0
  39. package/dist/cli/commands/ChatCommand.js +158 -13
  40. package/dist/cli/commands/ChatCommand.js.map +1 -1
  41. package/dist/cli/commands/CompleteCommand.d.ts +4 -0
  42. package/dist/cli/commands/CompleteCommand.js +143 -10
  43. package/dist/cli/commands/CompleteCommand.js.map +1 -1
  44. package/dist/cli/commands/DebugCommand.js +5 -5
  45. package/dist/cli/commands/DebugCommand.js.map +1 -1
  46. package/dist/cli/commands/InfillCommand.d.ts +4 -0
  47. package/dist/cli/commands/InfillCommand.js +142 -10
  48. package/dist/cli/commands/InfillCommand.js.map +1 -1
  49. package/dist/cli/commands/OnPostInstallCommand.js +12 -2
  50. package/dist/cli/commands/OnPostInstallCommand.js.map +1 -1
  51. package/dist/cli/commands/inspect/commands/InspectEstimateCommand.d.ts +1 -0
  52. package/dist/cli/commands/inspect/commands/InspectEstimateCommand.js +14 -7
  53. package/dist/cli/commands/inspect/commands/InspectEstimateCommand.js.map +1 -1
  54. package/dist/cli/commands/inspect/commands/InspectGgufCommand.js +13 -3
  55. package/dist/cli/commands/inspect/commands/InspectGgufCommand.js.map +1 -1
  56. package/dist/cli/commands/inspect/commands/InspectGpuCommand.js +20 -10
  57. package/dist/cli/commands/inspect/commands/InspectGpuCommand.js.map +1 -1
  58. package/dist/cli/commands/inspect/commands/InspectMeasureCommand.d.ts +2 -0
  59. package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js +234 -77
  60. package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js.map +1 -1
  61. package/dist/cli/recommendedModels.js +11 -1
  62. package/dist/cli/recommendedModels.js.map +1 -1
  63. package/dist/cli/utils/ConsoleTable.d.ts +1 -0
  64. package/dist/cli/utils/ConsoleTable.js +5 -1
  65. package/dist/cli/utils/ConsoleTable.js.map +1 -1
  66. package/dist/cli/utils/interactivelyAskForModel.d.ts +2 -1
  67. package/dist/cli/utils/interactivelyAskForModel.js +16 -13
  68. package/dist/cli/utils/interactivelyAskForModel.js.map +1 -1
  69. package/dist/cli/utils/isRunningUnderRosetta.d.ts +1 -0
  70. package/dist/cli/utils/isRunningUnderRosetta.js +20 -0
  71. package/dist/cli/utils/isRunningUnderRosetta.js.map +1 -0
  72. package/dist/cli/utils/printCommonInfoLines.d.ts +4 -2
  73. package/dist/cli/utils/printCommonInfoLines.js +67 -5
  74. package/dist/cli/utils/printCommonInfoLines.js.map +1 -1
  75. package/dist/cli/utils/resolveCommandGgufPath.d.ts +3 -1
  76. package/dist/cli/utils/resolveCommandGgufPath.js +6 -5
  77. package/dist/cli/utils/resolveCommandGgufPath.js.map +1 -1
  78. package/dist/cli/utils/toBytes.d.ts +1 -0
  79. package/dist/cli/utils/toBytes.js +5 -0
  80. package/dist/cli/utils/toBytes.js.map +1 -0
  81. package/dist/config.d.ts +3 -0
  82. package/dist/config.js +3 -0
  83. package/dist/config.js.map +1 -1
  84. package/dist/evaluator/LlamaChat/LlamaChat.d.ts +12 -3
  85. package/dist/evaluator/LlamaChat/LlamaChat.js +21 -7
  86. package/dist/evaluator/LlamaChat/LlamaChat.js.map +1 -1
  87. package/dist/evaluator/LlamaChatSession/LlamaChatSession.d.ts +6 -2
  88. package/dist/evaluator/LlamaChatSession/LlamaChatSession.js +3 -0
  89. package/dist/evaluator/LlamaChatSession/LlamaChatSession.js.map +1 -1
  90. package/dist/evaluator/LlamaCompletion.d.ts +3 -0
  91. package/dist/evaluator/LlamaCompletion.js +5 -0
  92. package/dist/evaluator/LlamaCompletion.js.map +1 -1
  93. package/dist/evaluator/LlamaContext/LlamaContext.d.ts +81 -38
  94. package/dist/evaluator/LlamaContext/LlamaContext.js +678 -132
  95. package/dist/evaluator/LlamaContext/LlamaContext.js.map +1 -1
  96. package/dist/evaluator/LlamaContext/TokenPredictor.d.ts +55 -0
  97. package/dist/evaluator/LlamaContext/TokenPredictor.js +20 -0
  98. package/dist/evaluator/LlamaContext/TokenPredictor.js.map +1 -0
  99. package/dist/evaluator/LlamaContext/tokenPredictors/DraftSequenceTokenPredictor.d.ts +56 -0
  100. package/dist/evaluator/LlamaContext/tokenPredictors/DraftSequenceTokenPredictor.js +266 -0
  101. package/dist/evaluator/LlamaContext/tokenPredictors/DraftSequenceTokenPredictor.js.map +1 -0
  102. package/dist/evaluator/LlamaContext/tokenPredictors/InputLookupTokenPredictor.d.ts +58 -0
  103. package/dist/evaluator/LlamaContext/tokenPredictors/InputLookupTokenPredictor.js +138 -0
  104. package/dist/evaluator/LlamaContext/tokenPredictors/InputLookupTokenPredictor.js.map +1 -0
  105. package/dist/evaluator/LlamaContext/types.d.ts +198 -5
  106. package/dist/evaluator/LlamaEmbeddingContext.d.ts +3 -0
  107. package/dist/evaluator/LlamaEmbeddingContext.js +3 -0
  108. package/dist/evaluator/LlamaEmbeddingContext.js.map +1 -1
  109. package/dist/evaluator/LlamaGrammar.d.ts +7 -1
  110. package/dist/evaluator/LlamaGrammar.js +6 -0
  111. package/dist/evaluator/LlamaGrammar.js.map +1 -1
  112. package/dist/evaluator/LlamaGrammarEvaluationState.d.ts +4 -4
  113. package/dist/evaluator/LlamaGrammarEvaluationState.js +16 -8
  114. package/dist/evaluator/LlamaGrammarEvaluationState.js.map +1 -1
  115. package/dist/evaluator/LlamaJsonSchemaGrammar.d.ts +5 -0
  116. package/dist/evaluator/LlamaJsonSchemaGrammar.js +7 -0
  117. package/dist/evaluator/LlamaJsonSchemaGrammar.js.map +1 -1
  118. package/dist/evaluator/LlamaModel/LlamaModel.d.ts +19 -11
  119. package/dist/evaluator/LlamaModel/LlamaModel.js +23 -29
  120. package/dist/evaluator/LlamaModel/LlamaModel.js.map +1 -1
  121. package/dist/evaluator/LlamaRankingContext.d.ts +76 -0
  122. package/dist/evaluator/LlamaRankingContext.js +158 -0
  123. package/dist/evaluator/LlamaRankingContext.js.map +1 -0
  124. package/dist/evaluator/TokenBias.d.ts +3 -0
  125. package/dist/evaluator/TokenBias.js +3 -0
  126. package/dist/evaluator/TokenBias.js.map +1 -1
  127. package/dist/evaluator/utils/chunkDocument.d.ts +86 -0
  128. package/dist/evaluator/utils/chunkDocument.js +212 -0
  129. package/dist/evaluator/utils/chunkDocument.js.map +1 -0
  130. package/dist/gguf/insights/GgufInsights.d.ts +3 -1
  131. package/dist/gguf/insights/GgufInsights.js +114 -8
  132. package/dist/gguf/insights/GgufInsights.js.map +1 -1
  133. package/dist/gguf/insights/GgufInsightsConfigurationResolver.d.ts +6 -3
  134. package/dist/gguf/insights/GgufInsightsConfigurationResolver.js +11 -7
  135. package/dist/gguf/insights/GgufInsightsConfigurationResolver.js.map +1 -1
  136. package/dist/gguf/insights/utils/resolveModelGpuLayersOption.d.ts +2 -1
  137. package/dist/gguf/insights/utils/resolveModelGpuLayersOption.js +13 -7
  138. package/dist/gguf/insights/utils/resolveModelGpuLayersOption.js.map +1 -1
  139. package/dist/gguf/parser/GgufV2Parser.js +29 -8
  140. package/dist/gguf/parser/GgufV2Parser.js.map +1 -1
  141. package/dist/gguf/parser/parseGguf.js +11 -11
  142. package/dist/gguf/parser/parseGguf.js.map +1 -1
  143. package/dist/gguf/readGgufFileInfo.js +8 -3
  144. package/dist/gguf/readGgufFileInfo.js.map +1 -1
  145. package/dist/gguf/types/GgufFileInfoTypes.d.ts +1 -0
  146. package/dist/gguf/types/GgufMetadataTypes.d.ts +9 -9
  147. package/dist/gguf/types/GgufMetadataTypes.js +1 -1
  148. package/dist/gguf/types/GgufMetadataTypes.js.map +1 -1
  149. package/dist/gguf/types/GgufTensorInfoTypes.d.ts +13 -0
  150. package/dist/gguf/types/GgufTensorInfoTypes.js.map +1 -1
  151. package/dist/index.d.ts +7 -2
  152. package/dist/index.js +6 -1
  153. package/dist/index.js.map +1 -1
  154. package/dist/tsconfig.tsbuildinfo +1 -1
  155. package/dist/utils/LlamaText.d.ts +4 -1
  156. package/dist/utils/LlamaText.js +4 -1
  157. package/dist/utils/LlamaText.js.map +1 -1
  158. package/dist/utils/cmake.js +23 -0
  159. package/dist/utils/cmake.js.map +1 -1
  160. package/dist/utils/pushAll.d.ts +1 -1
  161. package/dist/utils/pushAll.js.map +1 -1
  162. package/dist/utils/tokenizerUtils.js +1 -1
  163. package/dist/utils/utilTypes.d.ts +5 -0
  164. package/llama/CMakeLists.txt +25 -8
  165. package/llama/addon/AddonContext.cpp +196 -22
  166. package/llama/addon/AddonContext.h +1 -0
  167. package/llama/addon/AddonGrammar.cpp +1 -4
  168. package/llama/addon/AddonGrammarEvaluationState.cpp +16 -5
  169. package/llama/addon/AddonModel.cpp +31 -39
  170. package/llama/addon/AddonModel.h +1 -1
  171. package/llama/addon/AddonModelLora.cpp +2 -2
  172. package/llama/addon/AddonModelLora.h +1 -1
  173. package/llama/addon/AddonSampler.cpp +7 -12
  174. package/llama/addon/addon.cpp +26 -7
  175. package/llama/addon/globals/getGpuInfo.cpp +30 -5
  176. package/llama/addon/globals/getGpuInfo.h +6 -1
  177. package/llama/addon/globals/getMemoryInfo.cpp +63 -0
  178. package/llama/addon/globals/getMemoryInfo.h +4 -0
  179. package/llama/binariesGithubRelease.json +1 -1
  180. package/llama/cmake/win32.ensureNinjaPath.cmake +68 -0
  181. package/llama/cmake/win32.ensureNodeLib.cmake +34 -0
  182. package/llama/cmake/win32.llvmApplyGnuModeAdaptations.cmake +12 -0
  183. package/llama/cmake/win32.llvmEnsureCmakeAr.cmake +37 -0
  184. package/llama/cmake/win32.llvmUseGnuModeCompilers.cmake +87 -0
  185. package/llama/cmake/win32.programFilesPaths.cmake +35 -0
  186. package/llama/gitRelease.bundle +0 -0
  187. package/llama/gpuInfo/vulkan-gpu-info.cpp +29 -2
  188. package/llama/gpuInfo/vulkan-gpu-info.h +1 -0
  189. package/llama/llama.cpp.info.json +1 -1
  190. package/llama/profiles/llvm.win32.host-arm64.target-arm64.cmake +14 -0
  191. package/llama/profiles/llvm.win32.host-x64.target-arm64.cmake +14 -0
  192. package/llama/profiles/llvm.win32.host-x64.target-x64.cmake +14 -0
  193. package/llama/toolchains/llvm.win32.host-x64.target-x64.cmake +20 -0
  194. package/llama/toolchains/win32.host-arm64.target-arm64.cmake +21 -0
  195. package/llama/toolchains/win32.host-x64.target-arm64.cmake +14 -34
  196. package/package.json +47 -44
  197. package/templates/README.md +1 -1
  198. package/templates/packed/electron-typescript-react.json +1 -1
  199. package/templates/packed/node-typescript.json +1 -1
@@ -30,7 +30,7 @@ class AddonModelLoraUnloadLoraWorker : public Napi::AsyncWorker {
30
30
  } catch (const std::exception& e) {
31
31
  SetError(e.what());
32
32
  } catch(...) {
33
- SetError("Unknown error when calling \"llama_lora_adapter_free\"");
33
+ SetError("Unknown error when calling \"llama_adapter_lora_free\"");
34
34
  }
35
35
  }
36
36
  void OnOK() {
@@ -55,7 +55,7 @@ void AddonModelLora::dispose(bool skipErase) {
55
55
  if (lora_adapter != nullptr) {
56
56
  auto loraAdapterToDispose = lora_adapter;
57
57
  lora_adapter = nullptr;
58
- llama_lora_adapter_free(loraAdapterToDispose);
58
+ llama_adapter_lora_free(loraAdapterToDispose);
59
59
 
60
60
  if (!skipErase && model->data != nullptr) {
61
61
  model->data->removeLora(this);
@@ -6,7 +6,7 @@
6
6
  class AddonModelLora : public Napi::ObjectWrap<AddonModelLora> {
7
7
  public:
8
8
  AddonModel* model;
9
- llama_lora_adapter * lora_adapter;
9
+ llama_adapter_lora * lora_adapter;
10
10
  std::string loraFilePath;
11
11
  uint32_t usages = 0;
12
12
 
@@ -10,8 +10,8 @@ AddonSampler::AddonSampler(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Ad
10
10
  model = Napi::ObjectWrap<AddonModel>::Unwrap(info[0].As<Napi::Object>());
11
11
  model->Ref();
12
12
 
13
- tokenCandidates.resize(llama_n_vocab(model->model));
14
- tokenCandidates.reserve(llama_n_vocab(model->model));
13
+ tokenCandidates.resize(llama_vocab_n_tokens(model->vocab));
14
+ tokenCandidates.reserve(llama_vocab_n_tokens(model->vocab));
15
15
  }
16
16
  AddonSampler::~AddonSampler() {
17
17
  dispose();
@@ -142,7 +142,7 @@ void AddonSampler::acceptToken(llama_token token) {
142
142
  repeatPenalty_lastTokens.push_back(token);
143
143
  }
144
144
 
145
- if (grammarEvaluationState != nullptr && grammarEvaluationState->sampler != nullptr && !llama_token_is_eog(model->model, token)) {
145
+ if (grammarEvaluationState != nullptr && grammarEvaluationState->sampler != nullptr && !llama_vocab_is_eog(model->vocab, token)) {
146
146
  llama_sampler_accept(grammarEvaluationState->sampler, token);
147
147
  }
148
148
  }
@@ -231,8 +231,8 @@ Napi::Value AddonSampler::ApplyConfig(const Napi::CallbackInfo& info) {
231
231
  }
232
232
 
233
233
  const int32_t resolved_top_k = topKSampler_topK <= 0
234
- ? llama_n_vocab(model->model)
235
- : std::min(topKSampler_topK, llama_n_vocab(model->model));
234
+ ? llama_vocab_n_tokens(model->vocab)
235
+ : std::min(topKSampler_topK, llama_vocab_n_tokens(model->vocab));
236
236
 
237
237
  topKSampler = llama_sampler_init_top_k(resolved_top_k);
238
238
  }
@@ -350,15 +350,10 @@ Napi::Value AddonSampler::ApplyConfig(const Napi::CallbackInfo& info) {
350
350
 
351
351
  if (shouldCreateSampler) {
352
352
  repeatPenaltySampler = llama_sampler_init_penalties(
353
- llama_n_vocab(model->model),
354
- llama_token_eos(model->model),
355
- llama_token_nl(model->model),
356
353
  repeatPenaltyMaxTokens,
357
354
  repeatPenalty,
358
355
  repeatPenaltyFrequencyPenalty,
359
- repeatPenaltyPresencePenalty,
360
- true,
361
- false
356
+ repeatPenaltyPresencePenalty
362
357
  );
363
358
  repeatPenalty_lastTokens = RingBuffer<llama_token>(repeatPenaltyMaxTokens);
364
359
 
@@ -409,7 +404,7 @@ Napi::Value AddonSampler::ApplyConfig(const Napi::CallbackInfo& info) {
409
404
  }
410
405
 
411
406
  tokenBiasSampler = llama_sampler_init_logit_bias(
412
- llama_n_vocab(model->model),
407
+ llama_vocab_n_tokens(model->vocab),
413
408
  tokenBiasSampler_biases.size(),
414
409
  tokenBiasSampler_biases.data()
415
410
  );
@@ -9,6 +9,7 @@
9
9
  #include "globals/addonProgress.h"
10
10
  #include "globals/getGpuInfo.h"
11
11
  #include "globals/getSwapInfo.h"
12
+ #include "globals/getMemoryInfo.h"
12
13
 
13
14
  bool backendInitialized = false;
14
15
  bool backendDisposed = false;
@@ -25,6 +26,21 @@ Napi::Value addonGetSupportsMmap(const Napi::CallbackInfo& info) {
25
26
  return Napi::Boolean::New(info.Env(), llama_supports_mmap());
26
27
  }
27
28
 
29
+ Napi::Value addonGetGpuSupportsMmap(const Napi::CallbackInfo& info) {
30
+ const auto llamaSupportsMmap = llama_supports_mmap();
31
+ const auto gpuDevice = getGpuDevice().first;
32
+
33
+ if (gpuDevice == nullptr) {
34
+ return Napi::Boolean::New(info.Env(), false);
35
+ }
36
+
37
+ ggml_backend_dev_props props;
38
+ ggml_backend_dev_get_props(gpuDevice, &props);
39
+
40
+ const bool gpuSupportsMmap = llama_supports_mmap() && props.caps.buffer_from_host_ptr;
41
+ return Napi::Boolean::New(info.Env(), gpuSupportsMmap);
42
+ }
43
+
28
44
  Napi::Value addonGetSupportsMlock(const Napi::CallbackInfo& info) {
29
45
  return Napi::Boolean::New(info.Env(), llama_supports_mlock());
30
46
  }
@@ -152,16 +168,16 @@ class AddonBackendUnloadWorker : public Napi::AsyncWorker {
152
168
  };
153
169
 
154
170
  Napi::Value addonLoadBackends(const Napi::CallbackInfo& info) {
155
- const bool forceLoadLibraries = info.Length() == 0
156
- ? false
157
- : info[0].IsBoolean()
158
- ? info[0].As<Napi::Boolean>().Value()
159
- : false;
171
+ const std::string forceLoadLibrariesSearchPath = info.Length() == 0
172
+ ? ""
173
+ : info[0].IsString()
174
+ ? info[0].As<Napi::String>().Utf8Value()
175
+ : "";
160
176
 
161
177
  ggml_backend_reg_count();
162
178
 
163
- if (forceLoadLibraries) {
164
- ggml_backend_load_all();
179
+ if (forceLoadLibrariesSearchPath.length() > 0) {
180
+ ggml_backend_load_all_from_path(forceLoadLibrariesSearchPath.c_str());
165
181
  }
166
182
 
167
183
  return info.Env().Undefined();
@@ -210,6 +226,7 @@ Napi::Object registerCallback(Napi::Env env, Napi::Object exports) {
210
226
  Napi::PropertyDescriptor::Function("systemInfo", systemInfo),
211
227
  Napi::PropertyDescriptor::Function("getSupportsGpuOffloading", addonGetSupportsGpuOffloading),
212
228
  Napi::PropertyDescriptor::Function("getSupportsMmap", addonGetSupportsMmap),
229
+ Napi::PropertyDescriptor::Function("getGpuSupportsMmap", addonGetGpuSupportsMmap),
213
230
  Napi::PropertyDescriptor::Function("getSupportsMlock", addonGetSupportsMlock),
214
231
  Napi::PropertyDescriptor::Function("getMathCores", addonGetMathCores),
215
232
  Napi::PropertyDescriptor::Function("getBlockSizeForGgmlType", addonGetBlockSizeForGgmlType),
@@ -220,7 +237,9 @@ Napi::Object registerCallback(Napi::Env env, Napi::Object exports) {
220
237
  Napi::PropertyDescriptor::Function("getGpuVramInfo", getGpuVramInfo),
221
238
  Napi::PropertyDescriptor::Function("getGpuDeviceInfo", getGpuDeviceInfo),
222
239
  Napi::PropertyDescriptor::Function("getGpuType", getGpuType),
240
+ Napi::PropertyDescriptor::Function("ensureGpuDeviceIsSupported", ensureGpuDeviceIsSupported),
223
241
  Napi::PropertyDescriptor::Function("getSwapInfo", getSwapInfo),
242
+ Napi::PropertyDescriptor::Function("getMemoryInfo", getMemoryInfo),
224
243
  Napi::PropertyDescriptor::Function("loadBackends", addonLoadBackends),
225
244
  Napi::PropertyDescriptor::Function("init", addonInit),
226
245
  Napi::PropertyDescriptor::Function("dispose", addonDispose),
@@ -89,17 +89,17 @@ Napi::Value getGpuDeviceInfo(const Napi::CallbackInfo& info) {
89
89
  return result;
90
90
  }
91
91
 
92
- Napi::Value getGpuType(const Napi::CallbackInfo& info) {
92
+ std::pair<ggml_backend_dev_t, std::string> getGpuDevice() {
93
93
  for (size_t i = 0; i < ggml_backend_dev_count(); i++) {
94
94
  ggml_backend_dev_t device = ggml_backend_dev_get(i);
95
95
  const auto deviceName = std::string(ggml_backend_dev_name(device));
96
96
 
97
97
  if (deviceName == "Metal") {
98
- return Napi::String::New(info.Env(), "metal");
98
+ return std::pair<ggml_backend_dev_t, std::string>(device, "metal");
99
99
  } else if (std::string(deviceName).find("Vulkan") == 0) {
100
- return Napi::String::New(info.Env(), "vulkan");
100
+ return std::pair<ggml_backend_dev_t, std::string>(device, "vulkan");
101
101
  } else if (std::string(deviceName).find("CUDA") == 0 || std::string(deviceName).find("ROCm") == 0 || std::string(deviceName).find("MUSA") == 0) {
102
- return Napi::String::New(info.Env(), "cuda");
102
+ return std::pair<ggml_backend_dev_t, std::string>(device, "cuda");
103
103
  }
104
104
  }
105
105
 
@@ -108,9 +108,34 @@ Napi::Value getGpuType(const Napi::CallbackInfo& info) {
108
108
  const auto deviceName = std::string(ggml_backend_dev_name(device));
109
109
 
110
110
  if (deviceName == "CPU") {
111
- return Napi::Boolean::New(info.Env(), false);
111
+ return std::pair<ggml_backend_dev_t, std::string>(device, "cpu");
112
112
  }
113
113
  }
114
114
 
115
+ return std::pair<ggml_backend_dev_t, std::string>(nullptr, "");
116
+ }
117
+
118
+ Napi::Value getGpuType(const Napi::CallbackInfo& info) {
119
+ const auto gpuDeviceRes = getGpuDevice();
120
+ const auto device = gpuDeviceRes.first;
121
+ const auto deviceType = gpuDeviceRes.second;
122
+
123
+ if (deviceType == "cpu") {
124
+ return Napi::Boolean::New(info.Env(), false);
125
+ } else if (device != nullptr && deviceType != "") {
126
+ return Napi::String::New(info.Env(), deviceType);
127
+ }
128
+
129
+ return info.Env().Undefined();
130
+ }
131
+
132
+ Napi::Value ensureGpuDeviceIsSupported(const Napi::CallbackInfo& info) {
133
+ #ifdef GPU_INFO_USE_VULKAN
134
+ if (!checkIsVulkanEnvSupported(logVulkanWarning)) {
135
+ Napi::Error::New(info.Env(), "Vulkan device is not supported").ThrowAsJavaScriptException();
136
+ return info.Env().Undefined();
137
+ }
138
+ #endif
139
+
115
140
  return info.Env().Undefined();
116
141
  }
@@ -1,6 +1,11 @@
1
1
  #pragma once
2
+ #include <utility>
3
+ #include <string>
2
4
  #include "napi.h"
5
+ #include "llama.h"
3
6
 
4
7
  Napi::Value getGpuVramInfo(const Napi::CallbackInfo& info);
5
8
  Napi::Value getGpuDeviceInfo(const Napi::CallbackInfo& info);
6
- Napi::Value getGpuType(const Napi::CallbackInfo& info);
9
+ std::pair<ggml_backend_dev_t, std::string> getGpuDevice();
10
+ Napi::Value getGpuType(const Napi::CallbackInfo& info);
11
+ Napi::Value ensureGpuDeviceIsSupported(const Napi::CallbackInfo& info);
@@ -0,0 +1,63 @@
1
+ #include "getMemoryInfo.h"
2
+ #include "addonLog.h"
3
+
4
+ #ifdef __APPLE__
5
+ #include <iostream>
6
+ #include <mach/mach.h>
7
+ #include <sys/sysctl.h>
8
+ #elif __linux__
9
+ #include <fstream>
10
+ #include <sstream>
11
+ #include <string>
12
+ #elif _WIN32
13
+ #include <iostream>
14
+ #include <windows.h>
15
+ #include <psapi.h>
16
+ #endif
17
+
18
+
19
+ Napi::Value getMemoryInfo(const Napi::CallbackInfo& info) {
20
+ uint64_t totalMemoryUsage = 0;
21
+
22
+ #ifdef __APPLE__
23
+ struct mach_task_basic_info taskInfo;
24
+ mach_msg_type_number_t infoCount = MACH_TASK_BASIC_INFO_COUNT;
25
+ if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&taskInfo, &infoCount) == KERN_SUCCESS) {
26
+ totalMemoryUsage = taskInfo.virtual_size;
27
+ } else {
28
+ addonLlamaCppLogCallback(GGML_LOG_LEVEL_ERROR, std::string("Failed to get memory usage info").c_str(), nullptr);
29
+ }
30
+ #elif __linux__
31
+ std::ifstream procStatus("/proc/self/status");
32
+ std::string line;
33
+ bool foundMemoryUsage = false;
34
+ while (std::getline(procStatus, line)) {
35
+ if (line.rfind("VmSize:", 0) == 0) { // Resident Set Size (current memory usage)
36
+ std::istringstream iss(line);
37
+ std::string key, unit;
38
+ size_t value;
39
+ if (iss >> key >> value >> unit) {
40
+ totalMemoryUsage = value * 1024; // Convert from kB to bytes
41
+ foundMemoryUsage = true;
42
+ }
43
+ break;
44
+ }
45
+ }
46
+
47
+ if (!foundMemoryUsage) {
48
+ addonLlamaCppLogCallback(GGML_LOG_LEVEL_ERROR, std::string("Failed to get memory usage info").c_str(), nullptr);
49
+ }
50
+ #elif _WIN32
51
+ PROCESS_MEMORY_COUNTERS_EX memCounters;
52
+
53
+ if (GetProcessMemoryInfo(GetCurrentProcess(), (PROCESS_MEMORY_COUNTERS*)&memCounters, sizeof(memCounters))) {
54
+ totalMemoryUsage = memCounters.PrivateUsage;
55
+ } else {
56
+ addonLlamaCppLogCallback(GGML_LOG_LEVEL_ERROR, std::string("Failed to get memory usage info").c_str(), nullptr);
57
+ }
58
+ #endif
59
+
60
+ Napi::Object obj = Napi::Object::New(info.Env());
61
+ obj.Set("total", Napi::Number::New(info.Env(), totalMemoryUsage));
62
+ return obj;
63
+ }
@@ -0,0 +1,4 @@
1
+ #pragma once
2
+ #include "napi.h"
3
+
4
+ Napi::Value getMemoryInfo(const Napi::CallbackInfo& info);
@@ -1,3 +1,3 @@
1
1
  {
2
- "release": "b4291"
2
+ "release": "b4529"
3
3
  }
@@ -0,0 +1,68 @@
1
+ function(ensureNinjaPath)
2
+ if ((NOT DEFINED CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}" OR NOT CMAKE_MAKE_PROGRAM) AND (CMAKE_GENERATOR STREQUAL "Ninja" OR CMAKE_GENERATOR STREQUAL "Ninja Multi-Config"))
3
+ find_program(NINJA_EXECUTABLE ninja)
4
+
5
+ set(CMAKE_MAKE_PROGRAM "")
6
+ set(CMAKE_MAKE_PROGRAM "" PARENT_SCOPE)
7
+
8
+ if(NINJA_EXECUTABLE AND EXISTS "${NINJA_EXECUTABLE}")
9
+ set(CMAKE_MAKE_PROGRAM "${NINJA_EXECUTABLE}")
10
+ set(CMAKE_MAKE_PROGRAM "${NINJA_EXECUTABLE}" CACHE FILEPATH "Make program")
11
+ set(CMAKE_MAKE_PROGRAM "${NINJA_EXECUTABLE}" PARENT_SCOPE)
12
+ endif()
13
+
14
+ if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
15
+ set(PROGRAMDATA_PATH "$ENV{ProgramData}")
16
+ file(TO_CMAKE_PATH "${PROGRAMDATA_PATH}" PROGRAMDATA_PATH)
17
+
18
+ if (PROGRAMDATA_PATH AND EXISTS "${PROGRAMDATA_PATH}")
19
+ file(GLOB_RECURSE FOUND_NINJA_EXE "${PROGRAMDATA_PATH}/chocolatey/bin/ninja.exe")
20
+
21
+ if(FOUND_NINJA_EXE)
22
+ list(GET FOUND_NINJA_EXE 0 FOUND_CMAKE_MAKE_PROGRAM)
23
+ set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}")
24
+ set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" CACHE FILEPATH "Make program")
25
+ set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" PARENT_SCOPE)
26
+ endif()
27
+ endif()
28
+ endif()
29
+
30
+ if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
31
+ set(LOCALAPPDATA_PATH "$ENV{LOCALAPPDATA}")
32
+ file(TO_CMAKE_PATH "${LOCALAPPDATA_PATH}" LOCALAPPDATA_PATH)
33
+
34
+ if (LOCALAPPDATA_PATH AND EXISTS "${LOCALAPPDATA_PATH}")
35
+ file(GLOB_RECURSE FOUND_NINJA_EXE "${LOCALAPPDATA_PATH}/Microsoft/WinGet/Packages/Ninja-build.Ninja_Microsoft.Winget.*/ninja.exe")
36
+
37
+ if(FOUND_NINJA_EXE)
38
+ list(GET FOUND_NINJA_EXE 0 FOUND_CMAKE_MAKE_PROGRAM)
39
+ set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}")
40
+ set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" CACHE FILEPATH "Make program")
41
+ set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" PARENT_SCOPE)
42
+ endif()
43
+ endif()
44
+ endif()
45
+
46
+ if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
47
+ foreach(PATH IN LISTS PROGRAMFILES_PATHS)
48
+ file(GLOB_RECURSE FOUND_NINJA_EXE
49
+ "${PATH}/Microsoft Visual Studio/*/CMake/Ninja/ninja.exe"
50
+ "${PATH}/Microsoft Visual Studio/**/*/CMake/Ninja/ninja.exe"
51
+ "${PATH}/Microsoft Visual Studio/*/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe"
52
+ "${PATH}/Microsoft Visual Studio/**/*/Common7/IDE/CommonExtensions/Microsoft/CMake/Ninja/ninja.exe")
53
+
54
+ if(FOUND_NINJA_EXE)
55
+ list(GET FOUND_NINJA_EXE 0 FOUND_CMAKE_MAKE_PROGRAM)
56
+ set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}")
57
+ set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" CACHE FILEPATH "Make program")
58
+ set(CMAKE_MAKE_PROGRAM "${FOUND_CMAKE_MAKE_PROGRAM}" PARENT_SCOPE)
59
+ break()
60
+ endif()
61
+ endforeach()
62
+ endif()
63
+
64
+ if (NOT CMAKE_MAKE_PROGRAM OR NOT EXISTS "${CMAKE_MAKE_PROGRAM}")
65
+ message(FATAL_ERROR "Ninja build system not found. Please install Ninja or Visual Studio Build Tools.")
66
+ endif()
67
+ endif()
68
+ endfunction()
@@ -0,0 +1,34 @@
1
+ function(ensureNodeLib HOST_ARCH TARGET_ARCH)
2
+ if (CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
3
+ if (NOT DEFINED NODE_LIB_CMAKE_AR)
4
+ foreach(PATH IN LISTS PROGRAMFILES_PATHS)
5
+ if(NODE_LIB_CMAKE_AR)
6
+ break()
7
+ endif()
8
+
9
+ file(GLOB_RECURSE FOUND_LIB_EXE
10
+ "${PATH}/Microsoft Visual Studio/*/VC/Tools/MSVC/*/bin/Host${HOST_ARCH}/${TARGET_ARCH}/lib.exe"
11
+ "${PATH}/Microsoft Visual Studio/**/*/VC/Tools/MSVC/*/bin/Host${HOST_ARCH}/${TARGET_ARCH}/lib.exe")
12
+
13
+ if(FOUND_LIB_EXE)
14
+ list(GET FOUND_LIB_EXE 0 NODE_LIB_CMAKE_AR)
15
+ break()
16
+ endif()
17
+ endforeach()
18
+ endif()
19
+
20
+ set(NODE_LIB_CMAKE_AR_MACHINE_FLAG "")
21
+ if (TARGET_ARCH STREQUAL "x64")
22
+ set(NODE_LIB_CMAKE_AR_MACHINE_FLAG "/MACHINE:X64")
23
+ elseif (TARGET_ARCH STREQUAL "arm64")
24
+ set(NODE_LIB_CMAKE_AR_MACHINE_FLAG "/MACHINE:ARM64")
25
+ endif()
26
+
27
+ if (EXISTS "${NODE_LIB_CMAKE_AR}")
28
+ # Generate node.lib
29
+ execute_process(COMMAND ${NODE_LIB_CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS} ${NODE_LIB_CMAKE_AR_MACHINE_FLAG} /nologo)
30
+ else()
31
+ message(FATAL_ERROR "Windows Resource Compiler (lib.exe) not found. Please install Visual Studio Build Tools.")
32
+ endif()
33
+ endif()
34
+ endfunction()
@@ -0,0 +1,12 @@
1
+ function(llvmApplyGnuModeAdaptations)
2
+ # adapt cmake-js to work with llvm in GNU mode
3
+ if (NOT CMAKE_SHARED_LINKER_FLAGS MATCHES "-Xlinker /DELAYLOAD:NODE.EXE")
4
+ string(REPLACE "/DELAYLOAD:NODE.EXE" "-Xlinker /DELAYLOAD:NODE.EXE -Xlinker /defaultlib:delayimp"
5
+ UPDATED_CMAKE_SHARED_LINKER_FLAGS
6
+ "${CMAKE_SHARED_LINKER_FLAGS}")
7
+ set(CMAKE_SHARED_LINKER_FLAGS "${UPDATED_CMAKE_SHARED_LINKER_FLAGS}" PARENT_SCOPE)
8
+ endif()
9
+
10
+ set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -Xclang --dependent-lib=msvcrt" PARENT_SCOPE)
11
+ set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Xclang --dependent-lib=msvcrt" PARENT_SCOPE)
12
+ endfunction()
@@ -0,0 +1,37 @@
1
+ function(llvmEnsureCmakeAr CURRENT_ARCH)
2
+ set (LLVM_DIR_ARCH_NAME "")
3
+ if (CURRENT_ARCH STREQUAL "x64")
4
+ set (LLVM_DIR_ARCH_NAME "x64")
5
+ elseif (CURRENT_ARCH STREQUAL "arm64")
6
+ set (LLVM_DIR_ARCH_NAME "ARM64")
7
+ endif()
8
+
9
+ if (NOT DEFINED CMAKE_AR OR NOT EXISTS "${CMAKE_AR}")
10
+ set(LLVM_INSTALL_PATHS "")
11
+ foreach(PATH IN LISTS PROGRAMFILES_PATHS)
12
+ list(APPEND LLVM_INSTALL_PATHS "${PATH}/LLVM")
13
+
14
+ file(GLOB_RECURSE FOUND_LLVM_ROOT LIST_DIRECTORIES true
15
+ "${PATH}/Microsoft Visual Studio/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}"
16
+ "${PATH}/Microsoft Visual Studio/**/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}")
17
+ list(FILTER FOUND_LLVM_ROOT INCLUDE REGEX "VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}$")
18
+
19
+ if(FOUND_LLVM_ROOT)
20
+ list(APPEND LLVM_INSTALL_PATHS ${FOUND_LLVM_ROOT})
21
+ endif()
22
+ endforeach()
23
+
24
+ if(DEFINED LLVM_ROOT AND EXISTS "${LLVM_ROOT}")
25
+ list(INSERT LLVM_INSTALL_PATHS 0 "${LLVM_ROOT}")
26
+ endif()
27
+
28
+ list(REMOVE_DUPLICATES LLVM_INSTALL_PATHS)
29
+
30
+ foreach(PATH IN LISTS LLVM_INSTALL_PATHS)
31
+ if(EXISTS "${PATH}/bin/llvm-ar.exe" AND EXISTS "${PATH}/bin/llvm-ar.exe")
32
+ set(CMAKE_AR "${PATH}/bin/llvm-ar.exe" PARENT_SCOPE)
33
+ break()
34
+ endif()
35
+ endforeach()
36
+ endif()
37
+ endfunction()
@@ -0,0 +1,87 @@
1
+ function(llvmUseGnuModeCompilers CURRENT_ARCH)
2
+ set(LLVM_INSTALLATION_URL "https://github.com/llvm/llvm-project/releases/tag/llvmorg-19.1.5")
3
+
4
+ set(CMAKE_C_COMPILER clang)
5
+ set(CMAKE_C_COMPILER clang PARENT_SCOPE)
6
+ set(CMAKE_CXX_COMPILER clang++)
7
+ set(CMAKE_CXX_COMPILER clang++ PARENT_SCOPE)
8
+ set(CMAKE_RC_COMPILER llvm-rc)
9
+ set(CMAKE_RC_COMPILER llvm-rc PARENT_SCOPE)
10
+
11
+
12
+ set (LLVM_DIR_ARCH_NAME "")
13
+ if (CURRENT_ARCH STREQUAL "x64")
14
+ set (LLVM_DIR_ARCH_NAME "x64")
15
+ elseif (CURRENT_ARCH STREQUAL "arm64")
16
+ set (LLVM_DIR_ARCH_NAME "ARM64")
17
+ endif()
18
+
19
+ set(LLVM_INSTALL_PATHS "")
20
+ foreach(PATH IN LISTS PROGRAMFILES_PATHS)
21
+ list(APPEND LLVM_INSTALL_PATHS "${PATH}/LLVM")
22
+
23
+ file(GLOB_RECURSE FOUND_LLVM_ROOT LIST_DIRECTORIES true
24
+ "${PATH}/Microsoft Visual Studio/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}"
25
+ "${PATH}/Microsoft Visual Studio/**/*/VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}")
26
+ list(FILTER FOUND_LLVM_ROOT INCLUDE REGEX "VC/Tools/Llvm/${LLVM_DIR_ARCH_NAME}$")
27
+
28
+ if(FOUND_LLVM_ROOT)
29
+ list(APPEND LLVM_INSTALL_PATHS ${FOUND_LLVM_ROOT})
30
+ endif()
31
+ endforeach()
32
+
33
+ if(DEFINED LLVM_ROOT AND EXISTS "${LLVM_ROOT}")
34
+ list(INSERT LLVM_INSTALL_PATHS 0 "${LLVM_ROOT}")
35
+ endif()
36
+
37
+ list(REMOVE_DUPLICATES LLVM_INSTALL_PATHS)
38
+
39
+ set(LLVM_ROOT "")
40
+ set(LLVM_ROOT "" PARENT_SCOPE)
41
+ foreach(PATH IN LISTS LLVM_INSTALL_PATHS)
42
+ if(EXISTS "${PATH}/bin/clang.exe" AND EXISTS "${PATH}/bin/clang++.exe" AND EXISTS "${PATH}/bin/llvm-rc.exe")
43
+ set(LLVM_ROOT "${PATH}")
44
+ set(LLVM_ROOT "${PATH}" PARENT_SCOPE)
45
+ break()
46
+ endif()
47
+ endforeach()
48
+
49
+ if(LLVM_ROOT STREQUAL "")
50
+ if (CURRENT_ARCH STREQUAL "arm64")
51
+ message(FATAL_ERROR "LLVM installation was not found. Please install LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
52
+ else()
53
+ message(FATAL_ERROR "LLVM installation was not found. Please install LLVM: ${LLVM_INSTALLATION_URL}")
54
+ endif()
55
+ endif()
56
+
57
+ if (NOT EXISTS "${CMAKE_C_COMPILER}" OR NOT EXISTS "${CMAKE_CXX_COMPILER}" OR NOT EXISTS "${CMAKE_RC_COMPILER}")
58
+ set(CMAKE_C_COMPILER "${LLVM_ROOT}/bin/clang.exe")
59
+ set(CMAKE_C_COMPILER "${LLVM_ROOT}/bin/clang.exe" PARENT_SCOPE)
60
+ set(CMAKE_CXX_COMPILER "${LLVM_ROOT}/bin/clang++.exe")
61
+ set(CMAKE_CXX_COMPILER "${LLVM_ROOT}/bin/clang++.exe" PARENT_SCOPE)
62
+ set(CMAKE_RC_COMPILER "${LLVM_ROOT}/bin/llvm-rc.exe")
63
+ set(CMAKE_RC_COMPILER "${LLVM_ROOT}/bin/llvm-rc.exe" PARENT_SCOPE)
64
+ endif()
65
+
66
+ if (NOT EXISTS "${CMAKE_C_COMPILER}")
67
+ if (CURRENT_ARCH STREQUAL "arm64")
68
+ message(FATAL_ERROR "Clang compiler not found at ${CMAKE_C_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
69
+ else()
70
+ message(FATAL_ERROR "Clang compiler not found at ${CMAKE_C_COMPILER}. Please reinstall LLVM: ${LLVM_INSTALLATION_URL}")
71
+ endif()
72
+ endif()
73
+ if (NOT EXISTS "${CMAKE_CXX_COMPILER}")
74
+ if (CURRENT_ARCH STREQUAL "arm64")
75
+ message(FATAL_ERROR "Clang++ compiler not found at ${CMAKE_CXX_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
76
+ else()
77
+ message(FATAL_ERROR "Clang++ compiler not found at ${CMAKE_CXX_COMPILER}. Please reinstall LLVM: ${LLVM_INSTALLATION_URL}")
78
+ endif()
79
+ endif()
80
+ if (NOT EXISTS "${CMAKE_RC_COMPILER}")
81
+ if (CURRENT_ARCH STREQUAL "arm64")
82
+ message(FATAL_ERROR "LLVM Resource Compiler not found at ${CMAKE_RC_COMPILER}. Please reinstall LLVM for WoA (Windows on Arm): ${LLVM_INSTALLATION_URL}")
83
+ else()
84
+ message(FATAL_ERROR "LLVM Resource Compiler not found at ${CMAKE_RC_COMPILER}. Please reinstall LLVM: ${LLVM_INSTALLATION_URL}")
85
+ endif()
86
+ endif()
87
+ endfunction()
@@ -0,0 +1,35 @@
1
+ function(setProgramFilesPaths CURRENT_ARCH)
2
+ set(PROGRAMFILES_X86_ENV_NAME "ProgramFiles(x86)")
3
+
4
+ set(PROGRAMFILES "$ENV{ProgramFiles}")
5
+ set(PROGRAMFILES_X86 "$ENV{${PROGRAMFILES_X86_ENV_NAME}}")
6
+ file(TO_CMAKE_PATH "${PROGRAMFILES}" PROGRAMFILES)
7
+ file(TO_CMAKE_PATH "${PROGRAMFILES_X86}" PROGRAMFILES_X86)
8
+
9
+ if(CURRENT_ARCH STREQUAL "arm64")
10
+ set(PROGRAMFILES_ARM64_ENV_NAME "ProgramFiles(Arm)")
11
+
12
+ set(PROGRAMFILES_ARM64 "$ENV{${PROGRAMFILES_ARM64_ENV_NAME}}")
13
+ file(TO_CMAKE_PATH "${PROGRAMFILES_ARM64}" PROGRAMFILES_ARM64)
14
+
15
+ set(PROGRAMFILES_PATHS_LIST
16
+ "${PROGRAMFILES_ARM64}"
17
+ "${PROGRAMFILES}"
18
+ "${PROGRAMFILES_X86}"
19
+ "C:/Program Files (Arm)"
20
+ "C:/Program Files"
21
+ "C:/Program Files (x86)"
22
+ )
23
+ list(REMOVE_DUPLICATES PROGRAMFILES_PATHS_LIST)
24
+ set(PROGRAMFILES_PATHS ${PROGRAMFILES_PATHS_LIST} PARENT_SCOPE)
25
+ else()
26
+ set(PROGRAMFILES_PATHS_LIST
27
+ "${PROGRAMFILES}"
28
+ "${PROGRAMFILES_X86}"
29
+ "C:/Program Files"
30
+ "C:/Program Files (x86)"
31
+ )
32
+ list(REMOVE_DUPLICATES PROGRAMFILES_PATHS_LIST)
33
+ set(PROGRAMFILES_PATHS ${PROGRAMFILES_PATHS_LIST} PARENT_SCOPE)
34
+ endif()
35
+ endfunction()
Binary file
@@ -5,7 +5,7 @@
5
5
 
6
6
  typedef void (*gpuInfoVulkanWarningLogCallback_t)(const char* message);
7
7
 
8
- static bool enumerateVulkanDevices(size_t* total, size_t* used, size_t* unifiedMemorySize, bool addDeviceNames, std::vector<std::string> * deviceNames, gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
8
+ static bool enumerateVulkanDevices(size_t* total, size_t* used, size_t* unifiedMemorySize, bool addDeviceNames, std::vector<std::string> * deviceNames, gpuInfoVulkanWarningLogCallback_t warningLogCallback, bool * checkSupported) {
9
9
  vk::ApplicationInfo appInfo("node-llama-cpp GPU info", 1, "llama.cpp", 1, VK_API_VERSION_1_2);
10
10
  vk::InstanceCreateInfo createInfo(vk::InstanceCreateFlags(), &appInfo, {}, {});
11
11
  vk::Instance instance = vk::createInstance(createInfo);
@@ -56,6 +56,22 @@ static bool enumerateVulkanDevices(size_t* total, size_t* used, size_t* unifiedM
56
56
  if (size > 0 && addDeviceNames) {
57
57
  (*deviceNames).push_back(std::string(deviceProps.deviceName.data()));
58
58
  }
59
+
60
+ if (checkSupported != nullptr && checkSupported) {
61
+ VkPhysicalDeviceFeatures2 features2 = {};
62
+ features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
63
+
64
+ VkPhysicalDeviceVulkan11Features vk11Features = {};
65
+ vk11Features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_FEATURES;
66
+ features2.pNext = &vk11Features;
67
+
68
+ vkGetPhysicalDeviceFeatures2(physicalDevice, &features2);
69
+ VkPhysicalDeviceFeatures2 device_features2;
70
+
71
+ if (!vk11Features.storageBuffer16BitAccess) {
72
+ *checkSupported = false;
73
+ }
74
+ }
59
75
  }
60
76
  }
61
77
  } else {
@@ -78,5 +94,16 @@ static bool enumerateVulkanDevices(size_t* total, size_t* used, size_t* unifiedM
78
94
  }
79
95
 
80
96
  bool gpuInfoGetTotalVulkanDevicesInfo(size_t* total, size_t* used, size_t* unifiedMemorySize, gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
81
- return enumerateVulkanDevices(total, used, unifiedMemorySize, false, nullptr, warningLogCallback);
97
+ return enumerateVulkanDevices(total, used, unifiedMemorySize, false, nullptr, warningLogCallback, nullptr);
98
+ }
99
+
100
+ bool checkIsVulkanEnvSupported(gpuInfoVulkanWarningLogCallback_t warningLogCallback) {
101
+ size_t total = 0;
102
+ size_t used = 0;
103
+ size_t unifiedMemorySize = 0;
104
+
105
+ bool isSupported = true;
106
+ enumerateVulkanDevices(&total, &used, &unifiedMemorySize, false, nullptr, warningLogCallback, &isSupported);
107
+
108
+ return isSupported;
82
109
  }
@@ -6,3 +6,4 @@
6
6
  typedef void (*gpuInfoVulkanWarningLogCallback_t)(const char* message);
7
7
 
8
8
  bool gpuInfoGetTotalVulkanDevicesInfo(size_t* total, size_t* used, size_t* unifiedMemorySize, gpuInfoVulkanWarningLogCallback_t warningLogCallback);
9
+ bool checkIsVulkanEnvSupported(gpuInfoVulkanWarningLogCallback_t warningLogCallback);
@@ -1,4 +1,4 @@
1
1
  {
2
- "tag": "b4291",
2
+ "tag": "b4529",
3
3
  "llamaCppGithubRepo": "ggerganov/llama.cpp"
4
4
  }