node-llama-cpp 3.0.0-beta.19 → 3.0.0-beta.20

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 (111) hide show
  1. package/README.md +1 -1
  2. package/dist/bindings/AddonTypes.d.ts +1 -0
  3. package/dist/bindings/Llama.js +14 -7
  4. package/dist/bindings/Llama.js.map +1 -1
  5. package/dist/bindings/getLlama.d.ts +20 -2
  6. package/dist/bindings/getLlama.js +23 -14
  7. package/dist/bindings/getLlama.js.map +1 -1
  8. package/dist/bindings/utils/detectAvailableComputeLayers.js +4 -0
  9. package/dist/bindings/utils/detectAvailableComputeLayers.js.map +1 -1
  10. package/dist/bindings/utils/detectGlibc.js +12 -2
  11. package/dist/bindings/utils/detectGlibc.js.map +1 -1
  12. package/dist/cli/cli.js +11 -9
  13. package/dist/cli/cli.js.map +1 -1
  14. package/dist/cli/commands/BuildCommand.js +4 -2
  15. package/dist/cli/commands/BuildCommand.js.map +1 -1
  16. package/dist/cli/commands/ChatCommand.js +3 -2
  17. package/dist/cli/commands/ChatCommand.js.map +1 -1
  18. package/dist/cli/commands/ClearCommand.js +3 -2
  19. package/dist/cli/commands/ClearCommand.js.map +1 -1
  20. package/dist/cli/commands/CompleteCommand.js +3 -1
  21. package/dist/cli/commands/CompleteCommand.js.map +1 -1
  22. package/dist/cli/commands/DownloadCommand.js +3 -2
  23. package/dist/cli/commands/DownloadCommand.js.map +1 -1
  24. package/dist/cli/commands/InfillCommand.js +3 -1
  25. package/dist/cli/commands/InfillCommand.js.map +1 -1
  26. package/dist/cli/commands/InitCommand.d.ts +11 -0
  27. package/dist/cli/commands/InitCommand.js +195 -0
  28. package/dist/cli/commands/InitCommand.js.map +1 -0
  29. package/dist/cli/commands/PullCommand.js +18 -10
  30. package/dist/cli/commands/PullCommand.js.map +1 -1
  31. package/dist/cli/commands/inspect/InspectCommand.js +3 -1
  32. package/dist/cli/commands/inspect/InspectCommand.js.map +1 -1
  33. package/dist/cli/commands/inspect/commands/InspectGgufCommand.js +5 -2
  34. package/dist/cli/commands/inspect/commands/InspectGgufCommand.js.map +1 -1
  35. package/dist/cli/commands/inspect/commands/InspectGpuCommand.js +3 -1
  36. package/dist/cli/commands/inspect/commands/InspectGpuCommand.js.map +1 -1
  37. package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js +3 -1
  38. package/dist/cli/commands/inspect/commands/InspectMeasureCommand.js.map +1 -1
  39. package/dist/cli/projectTemplates.d.ts +7 -0
  40. package/dist/cli/projectTemplates.js +10 -0
  41. package/dist/cli/projectTemplates.js.map +1 -0
  42. package/dist/cli/startCreateCli.d.ts +2 -0
  43. package/dist/cli/startCreateCli.js +26 -0
  44. package/dist/cli/startCreateCli.js.map +1 -0
  45. package/dist/cli/utils/consolePromptQuestion.d.ts +2 -1
  46. package/dist/cli/utils/consolePromptQuestion.js +4 -2
  47. package/dist/cli/utils/consolePromptQuestion.js.map +1 -1
  48. package/dist/cli/utils/interactivelyAskForModel.d.ts +7 -0
  49. package/dist/cli/utils/interactivelyAskForModel.js +451 -0
  50. package/dist/cli/utils/interactivelyAskForModel.js.map +1 -0
  51. package/dist/cli/utils/projectTemplates.d.ts +19 -0
  52. package/dist/cli/utils/projectTemplates.js +47 -0
  53. package/dist/cli/utils/projectTemplates.js.map +1 -0
  54. package/dist/cli/utils/resolveCommandGgufPath.js +7 -435
  55. package/dist/cli/utils/resolveCommandGgufPath.js.map +1 -1
  56. package/dist/cli/utils/splitAnsiToLines.d.ts +1 -1
  57. package/dist/cli/utils/splitAnsiToLines.js +20 -5
  58. package/dist/cli/utils/splitAnsiToLines.js.map +1 -1
  59. package/dist/cli/utils/withCliCommandDescriptionDocsUrl.d.ts +2 -0
  60. package/dist/cli/utils/withCliCommandDescriptionDocsUrl.js +23 -0
  61. package/dist/cli/utils/withCliCommandDescriptionDocsUrl.js.map +1 -0
  62. package/dist/commands.d.ts +1 -0
  63. package/dist/commands.js +3 -0
  64. package/dist/commands.js.map +1 -1
  65. package/dist/config.d.ts +21 -1
  66. package/dist/config.js +27 -4
  67. package/dist/config.js.map +1 -1
  68. package/dist/evaluator/LlamaContext/LlamaContext.js +0 -1
  69. package/dist/evaluator/LlamaContext/LlamaContext.js.map +1 -1
  70. package/dist/evaluator/LlamaModel.d.ts +32 -1
  71. package/dist/evaluator/LlamaModel.js +54 -1
  72. package/dist/evaluator/LlamaModel.js.map +1 -1
  73. package/dist/utils/createModelDownloader.d.ts +3 -0
  74. package/dist/utils/createModelDownloader.js.map +1 -1
  75. package/llama/addon.cpp +92 -0
  76. package/llama/binariesGithubRelease.json +1 -1
  77. package/llama/gitRelease.bundle +0 -0
  78. package/llama/llama.cpp.info.json +1 -1
  79. package/llamaBins/linux-arm64/_nlcBuildMetadata.json +1 -1
  80. package/llamaBins/linux-arm64/llama-addon.node +0 -0
  81. package/llamaBins/linux-armv7l/_nlcBuildMetadata.json +1 -1
  82. package/llamaBins/linux-armv7l/llama-addon.node +0 -0
  83. package/llamaBins/linux-x64/_nlcBuildMetadata.json +1 -1
  84. package/llamaBins/linux-x64/llama-addon.node +0 -0
  85. package/llamaBins/linux-x64-cuda/_nlcBuildMetadata.json +1 -1
  86. package/llamaBins/linux-x64-cuda/llama-addon.node +0 -0
  87. package/llamaBins/linux-x64-vulkan/_nlcBuildMetadata.json +1 -1
  88. package/llamaBins/linux-x64-vulkan/llama-addon.node +0 -0
  89. package/llamaBins/mac-arm64-metal/_nlcBuildMetadata.json +1 -1
  90. package/llamaBins/mac-arm64-metal/default.metallib +0 -0
  91. package/llamaBins/mac-arm64-metal/llama-addon.node +0 -0
  92. package/llamaBins/mac-x64/_nlcBuildMetadata.json +1 -1
  93. package/llamaBins/mac-x64/llama-addon.node +0 -0
  94. package/llamaBins/win-arm64/_nlcBuildMetadata.json +1 -1
  95. package/llamaBins/win-arm64/llama-addon.exp +0 -0
  96. package/llamaBins/win-arm64/llama-addon.lib +0 -0
  97. package/llamaBins/win-arm64/llama-addon.node +0 -0
  98. package/llamaBins/win-x64/_nlcBuildMetadata.json +1 -1
  99. package/llamaBins/win-x64/llama-addon.exp +0 -0
  100. package/llamaBins/win-x64/llama-addon.lib +0 -0
  101. package/llamaBins/win-x64/llama-addon.node +0 -0
  102. package/llamaBins/win-x64-cuda/_nlcBuildMetadata.json +1 -1
  103. package/llamaBins/win-x64-cuda/llama-addon.exp +0 -0
  104. package/llamaBins/win-x64-cuda/llama-addon.lib +0 -0
  105. package/llamaBins/win-x64-cuda/llama-addon.node +0 -0
  106. package/llamaBins/win-x64-vulkan/_nlcBuildMetadata.json +1 -1
  107. package/llamaBins/win-x64-vulkan/llama-addon.exp +0 -0
  108. package/llamaBins/win-x64-vulkan/llama-addon.lib +0 -0
  109. package/llamaBins/win-x64-vulkan/llama-addon.node +0 -0
  110. package/package.json +17 -13
  111. package/templates/package.json +10 -0
@@ -0,0 +1,451 @@
1
+ import path from "path";
2
+ import process from "process";
3
+ import chalk from "chalk";
4
+ import bytes from "bytes";
5
+ import fs from "fs-extra";
6
+ import stripAnsi from "strip-ansi";
7
+ import logSymbols from "log-symbols";
8
+ import { getReadableContextSize } from "../../utils/getReadableContextSize.js";
9
+ import { arrowChar } from "../../consts.js";
10
+ import { getGgufSplitPartsInfo } from "../../gguf/utils/resolveSplitGgufParts.js";
11
+ import { withProgressLog } from "../../utils/withProgressLog.js";
12
+ import { GgufInsights } from "../../gguf/insights/GgufInsights.js";
13
+ import { readGgufFileInfo } from "../../gguf/readGgufFileInfo.js";
14
+ import { getPrettyBuildGpuName } from "../../bindings/consts.js";
15
+ import { isUrl } from "../../utils/isUrl.js";
16
+ import { resolveModelRecommendationFileOptions } from "./resolveModelRecommendationFileOptions.js";
17
+ import { getReadablePath } from "./getReadablePath.js";
18
+ import { basicChooseFromListConsoleInteraction } from "./basicChooseFromListConsoleInteraction.js";
19
+ import { splitAnsiToLines } from "./splitAnsiToLines.js";
20
+ import { consolePromptQuestion } from "./consolePromptQuestion.js";
21
+ import { renderInfoLine } from "./printInfoLine.js";
22
+ const vramStateUpdateInterval = 1000;
23
+ export async function interactivelyAskForModel({ llama, modelsDirectory, allowLocalModels = true, downloadIntent = true }) {
24
+ let localModelFileOptions = [];
25
+ const recommendedModelOptions = [];
26
+ const activeInteractionController = new AbortController();
27
+ let scheduledTitleRerenderTimeout = undefined;
28
+ let lastVramState = llama.getVramState();
29
+ const canUseGpu = lastVramState.total > 0;
30
+ if (allowLocalModels && modelsDirectory != null && await fs.existsSync(modelsDirectory)) {
31
+ const ggufFileNames = (await fs.readdir(modelsDirectory))
32
+ .filter((fileName) => {
33
+ if (!fileName.endsWith(".gguf"))
34
+ return false;
35
+ const partsInfo = getGgufSplitPartsInfo(fileName);
36
+ return partsInfo == null || partsInfo.part === 1;
37
+ });
38
+ let readItems = 0;
39
+ const renderProgress = () => ("(" + String(readItems)
40
+ .padStart(String(ggufFileNames.length).length, "0") + "/" + ggufFileNames.length + ")");
41
+ if (ggufFileNames.length > 0)
42
+ await withProgressLog({
43
+ loadingText: "Reading local models directory",
44
+ failText: "Failed to read local models directory",
45
+ successText: "Read local models directory",
46
+ noSuccessLiveStatus: true,
47
+ initialProgressBarText: renderProgress()
48
+ }, async (progressUpdater) => {
49
+ localModelFileOptions = await Promise.all(ggufFileNames.map(async (fileName) => {
50
+ const filePath = path.join(modelsDirectory, fileName);
51
+ let ggufInsights = undefined;
52
+ try {
53
+ const ggufFileInfo = await readGgufFileInfo(filePath, {
54
+ sourceType: "filesystem",
55
+ signal: activeInteractionController.signal
56
+ });
57
+ ggufInsights = await GgufInsights.from(ggufFileInfo, llama);
58
+ }
59
+ catch (err) {
60
+ // do nothing
61
+ }
62
+ readItems++;
63
+ progressUpdater.setProgress(readItems / ggufFileNames.length, renderProgress());
64
+ const compatibilityScore = ggufInsights?.configurationResolver.scoreModelConfigurationCompatibility();
65
+ return {
66
+ type: "localModel",
67
+ title: fileName,
68
+ path: filePath,
69
+ addedDate: (await fs.stat(filePath)).birthtimeMs,
70
+ ggufInsights: ggufInsights,
71
+ compatibilityScore: compatibilityScore?.compatibilityScore,
72
+ compatibilityBonusScore: compatibilityScore?.bonusScore,
73
+ compatibilityContextSize: compatibilityScore?.resolvedValues.contextSize
74
+ };
75
+ }));
76
+ localModelFileOptions = localModelFileOptions.sort((a, b) => {
77
+ if (a.compatibilityScore == null && b.compatibilityScore == null)
78
+ return b.addedDate - a.addedDate;
79
+ else if (a.compatibilityScore == null)
80
+ return -1;
81
+ else if (b.compatibilityScore == null)
82
+ return 1;
83
+ else if (b.compatibilityScore === a.compatibilityScore &&
84
+ b.compatibilityBonusScore != null && a.compatibilityBonusScore != null)
85
+ return b.compatibilityBonusScore - a.compatibilityBonusScore;
86
+ return b.compatibilityScore - a.compatibilityScore;
87
+ });
88
+ });
89
+ }
90
+ try {
91
+ // if this file gets very big, we don't want to load it on every CLI usage
92
+ const { recommendedModels } = await import("../recommendedModels.js");
93
+ for (const recommendedModel of recommendedModels) {
94
+ const potentialUrls = resolveModelRecommendationFileOptions(recommendedModel);
95
+ if (potentialUrls.length > 0)
96
+ recommendedModelOptions.push({
97
+ type: "recommendedModel",
98
+ title: recommendedModel.name,
99
+ potentialUrls,
100
+ description: recommendedModel.description
101
+ });
102
+ }
103
+ }
104
+ catch (err) {
105
+ // do nothing
106
+ }
107
+ let initialFocusIndex = 3; // first model option
108
+ const options = [
109
+ {
110
+ type: "action",
111
+ text: allowLocalModels
112
+ ? "Enter a model URL or file path..."
113
+ : "Enter a model URL...",
114
+ key: "getPath"
115
+ },
116
+ ...((localModelFileOptions.length === 0 || modelsDirectory == null)
117
+ ? []
118
+ : [
119
+ {
120
+ type: "separator",
121
+ text: () => " " + chalk.gray("-".repeat(4))
122
+ },
123
+ {
124
+ type: "separator",
125
+ text: " " + chalk.bold("Downloaded models") + " " + chalk.dim(`(${getReadablePath(modelsDirectory)})`)
126
+ },
127
+ ...localModelFileOptions
128
+ ]),
129
+ ...(recommendedModelOptions.length === 0
130
+ ? []
131
+ : [
132
+ {
133
+ type: "separator",
134
+ text: () => " " + chalk.gray("-".repeat(4))
135
+ },
136
+ {
137
+ type: "separator",
138
+ text: " " + chalk.bold("Recommended models") + (downloadIntent
139
+ ? (" " + chalk.dim("(select to download)"))
140
+ : "")
141
+ },
142
+ ...recommendedModelOptions
143
+ ])
144
+ ];
145
+ try {
146
+ // eslint-disable-next-line no-constant-condition
147
+ while (true) {
148
+ const minWidth = Math.min(80, process.stdout.columns - 1);
149
+ const selectedItem = await basicChooseFromListConsoleInteraction({
150
+ title(item, rerender) {
151
+ const title = chalk.bold("Select a model:") + " ";
152
+ const vramState = llama.getVramState();
153
+ const vramStateText = vramState.total === 0
154
+ ? chalk.bgGray(" " +
155
+ "No GPU" +
156
+ " ")
157
+ : (chalk.bgGray(" " +
158
+ chalk.yellow("GPU:") + " " + getPrettyBuildGpuName(llama.gpu) +
159
+ " ") +
160
+ " " +
161
+ chalk.bgGray(" " +
162
+ chalk.yellow("VRAM usage:") + " " +
163
+ (String(Math.floor((vramState.used / vramState.total) * 100 * 100) / 100) + "%") + " " +
164
+ chalk.dim("(" + bytes(vramState.used) + "/" + bytes(vramState.total) + ")") +
165
+ " "));
166
+ const pad = Math.max(0, minWidth - (stripAnsi(title).length + stripAnsi(vramStateText).length));
167
+ lastVramState = vramState;
168
+ clearTimeout(scheduledTitleRerenderTimeout);
169
+ scheduledTitleRerenderTimeout = setTimeout(() => {
170
+ const vramState = llama.getVramState();
171
+ if (lastVramState.used !== vramState.used || lastVramState.total !== vramState.total)
172
+ rerender();
173
+ }, vramStateUpdateInterval);
174
+ return [
175
+ title,
176
+ " ".repeat(pad),
177
+ vramStateText
178
+ ].join("");
179
+ },
180
+ footer(item) {
181
+ if (item.type !== "recommendedModel" || item.description == null)
182
+ return undefined;
183
+ const leftPad = 3;
184
+ const maxWidth = Math.max(1, process.stdout.columns - 2 - leftPad);
185
+ const lines = splitAnsiToLines(item.description, maxWidth);
186
+ return " \n" +
187
+ " ".repeat(leftPad) + chalk.bold.gray("Model description") + "\n" +
188
+ lines.map((line) => (" ".repeat(leftPad) + line))
189
+ .join("\n") + "\n" +
190
+ splitAnsiToLines(renderRecommendedModelTechnicalInfo(item.selectedUrl, maxWidth, canUseGpu), maxWidth)
191
+ .map((line) => (" ".repeat(leftPad) + line))
192
+ .join("\n");
193
+ },
194
+ items: options,
195
+ renderItem(item, focused, rerender) {
196
+ return renderSelectionItem(item, focused, rerender, activeInteractionController.signal, llama);
197
+ },
198
+ canFocusItem(item) {
199
+ return item.type === "recommendedModel" || item.type === "localModel" || item.type === "action";
200
+ },
201
+ canSelectItem(item) {
202
+ if (item.type === "recommendedModel")
203
+ return item.selectedUrl != null;
204
+ return item.type === "localModel" || item.type === "action";
205
+ },
206
+ initialFocusIndex: Math.min(initialFocusIndex, options.length - 1),
207
+ aboveItemsPadding: 1,
208
+ belowItemsPadding: 1,
209
+ renderSummaryOnExit(item) {
210
+ if (item == null || item.type === "action" || item.type === "separator")
211
+ return "";
212
+ else if (item.type === "localModel") {
213
+ const modelTitle = item.title instanceof Function
214
+ ? item.title()
215
+ : item.title;
216
+ return logSymbols.success + " Selected model " + chalk.blue(modelTitle);
217
+ }
218
+ else if (item.type === "recommendedModel") {
219
+ const modelTitle = item.title instanceof Function
220
+ ? item.title()
221
+ : item.title;
222
+ return logSymbols.success + " Selected model " + chalk.blue(modelTitle);
223
+ }
224
+ void (item);
225
+ return "";
226
+ },
227
+ exitOnCtrlC: true
228
+ });
229
+ if (selectedItem == null || selectedItem.type === "separator")
230
+ continue;
231
+ else if (selectedItem.type === "localModel")
232
+ return selectedItem.path;
233
+ else if (selectedItem.type === "recommendedModel" && selectedItem.selectedUrl != null)
234
+ return selectedItem.selectedUrl.url;
235
+ else if (selectedItem.type === "action") {
236
+ if (selectedItem.key === "getPath") {
237
+ initialFocusIndex = 0;
238
+ const selectedModelUrlOrPath = await askForModelUrlOrPath(allowLocalModels);
239
+ if (selectedModelUrlOrPath == null)
240
+ continue;
241
+ return selectedModelUrlOrPath;
242
+ }
243
+ }
244
+ }
245
+ }
246
+ finally {
247
+ activeInteractionController.abort();
248
+ }
249
+ }
250
+ async function askForModelUrlOrPath(allowLocalModels) {
251
+ return await consolePromptQuestion(allowLocalModels
252
+ ? chalk.bold("Enter a model URL or file path: ")
253
+ : chalk.bold("Enter a model URL: "), {
254
+ exitOnCtrlC: false,
255
+ async validate(input) {
256
+ if (isUrl(input, false)) {
257
+ try {
258
+ new URL(input);
259
+ }
260
+ catch (err) {
261
+ return "Invalid URL";
262
+ }
263
+ return null;
264
+ }
265
+ else if (!allowLocalModels)
266
+ return "Only URLs are allowed";
267
+ try {
268
+ if (await fs.pathExists(input))
269
+ return null;
270
+ return "File does not exist";
271
+ }
272
+ catch (err) {
273
+ return "Invalid path";
274
+ }
275
+ },
276
+ renderSummaryOnExit(item) {
277
+ if (item == null)
278
+ return "";
279
+ if (isUrl(item, false))
280
+ return logSymbols.success + " Entered model URL " + chalk.blue(item);
281
+ else
282
+ return logSymbols.success + " Entered model path " + chalk.blue(item);
283
+ }
284
+ });
285
+ }
286
+ function renderSelectionItem(item, focused, rerender, abortSignal, llama) {
287
+ if (item.type === "localModel") {
288
+ let modelText = item.title instanceof Function
289
+ ? item.title()
290
+ : item.title;
291
+ if (item.ggufInsights != null)
292
+ modelText += " " + renderModelCompatibility(item.ggufInsights, item.compatibilityScore, item.compatibilityContextSize);
293
+ else
294
+ modelText += " " + chalk.bgGray.yellow(" Cannot read metadata ");
295
+ return renderSelectableItem(modelText, focused);
296
+ }
297
+ else if (item.type === "recommendedModel") {
298
+ let modelText = item.title instanceof Function
299
+ ? item.title()
300
+ : item.title;
301
+ if (item.selectedUrl == null) {
302
+ if (item.urlSelectionLoadingState == null) {
303
+ item.urlSelectionLoadingState = "loading";
304
+ void selectFileForModelRecommendation({
305
+ recommendedModelOption: item,
306
+ abortSignal,
307
+ rerenderOption: rerender,
308
+ llama
309
+ });
310
+ }
311
+ if (item.urlSelectionLoadingState === "loading")
312
+ modelText += " " + chalk.bgGray.yellow(" Loading info ");
313
+ else if (item.urlSelectionLoadingState === "done")
314
+ modelText += " " + chalk.bgGray.yellow(" Failed to load info ");
315
+ else
316
+ void (item.urlSelectionLoadingState);
317
+ }
318
+ else
319
+ modelText += " " + renderModelCompatibility(item.selectedUrl.ggufInsights, item.selectedUrl.compatibilityScore.compatibilityScore, item.selectedUrl.compatibilityScore.resolvedValues.contextSize);
320
+ return renderSelectableItem(modelText, focused);
321
+ }
322
+ else if (item.type === "separator") {
323
+ return item.text instanceof Function
324
+ ? item.text()
325
+ : item.text;
326
+ }
327
+ else if (item.type === "action") {
328
+ const actionText = item.text instanceof Function
329
+ ? item.text()
330
+ : item.text;
331
+ return renderSelectableItem(actionText, focused);
332
+ }
333
+ void (item);
334
+ return "";
335
+ }
336
+ function renderSelectableItem(text, focused) {
337
+ if (focused)
338
+ return " " + chalk.cyan(arrowChar) + " " + chalk.cyan(text);
339
+ return " * " + text;
340
+ }
341
+ function renderModelCompatibility(ggufInsights, compatibilityScore, compatibilityContextSize) {
342
+ const info = [];
343
+ if (compatibilityScore != null)
344
+ info.push(renderCompatibilityPercentageWithColors(compatibilityScore * 100) + chalk.whiteBright(" compatibility")
345
+ + (compatibilityContextSize == null
346
+ ? ""
347
+ : (chalk.gray(" | ") + chalk.yellow(getReadableContextSize(compatibilityContextSize)) + chalk.whiteBright(" context"))));
348
+ info.push(chalk.yellow("Size:") + " " + chalk.whiteBright(bytes(ggufInsights.modelSize)));
349
+ return info
350
+ .map((item) => chalk.bgGray(" " + item + " "))
351
+ .join(" ");
352
+ }
353
+ function renderRecommendedModelTechnicalInfo(modelSelectedUrl, maxWidth, canUseGpu) {
354
+ if (modelSelectedUrl == null)
355
+ return " \n" + chalk.bgGray.yellow(" Loading info ") + "\n ";
356
+ const ggufInsights = modelSelectedUrl.ggufInsights;
357
+ const compatibilityScore = modelSelectedUrl.compatibilityScore;
358
+ const longestTitle = Math.max("Model info".length, "Resolved config".length) + 1;
359
+ return " \n" + [
360
+ renderInfoLine({
361
+ title: "Model info",
362
+ padTitle: longestTitle,
363
+ separateLines: false,
364
+ maxWidth,
365
+ info: [{
366
+ title: "Size",
367
+ value: bytes(ggufInsights.modelSize)
368
+ }, {
369
+ show: ggufInsights.trainContextSize != null,
370
+ title: "Train context size",
371
+ value: () => getReadableContextSize(ggufInsights.trainContextSize ?? 0)
372
+ }]
373
+ }),
374
+ renderInfoLine({
375
+ title: "Resolved config",
376
+ padTitle: longestTitle,
377
+ separateLines: false,
378
+ maxWidth,
379
+ info: [{
380
+ title: "",
381
+ value: renderCompatibilityPercentageWithColors(compatibilityScore.compatibilityScore * 100) + " compatibility"
382
+ }, {
383
+ show: ggufInsights.trainContextSize != null,
384
+ title: "Context size",
385
+ value: getReadableContextSize(compatibilityScore.resolvedValues.contextSize)
386
+ }, {
387
+ show: canUseGpu,
388
+ title: "GPU layers",
389
+ value: () => (compatibilityScore.resolvedValues.gpuLayers + "/" + ggufInsights.totalLayers + " " +
390
+ chalk.dim(`(${Math.floor((compatibilityScore.resolvedValues.gpuLayers / ggufInsights.totalLayers) * 100)}%)`))
391
+ }, {
392
+ show: canUseGpu,
393
+ title: "VRAM usage",
394
+ value: () => bytes(compatibilityScore.resolvedValues.totalVramUsage)
395
+ }]
396
+ })
397
+ ].join("\n");
398
+ }
399
+ function renderCompatibilityPercentageWithColors(percentage, { greenBright = 100, green = 95, yellow = 85, yellowBright = 75 } = {}) {
400
+ const percentageText = String(Math.floor(percentage)) + "%";
401
+ if (percentage >= greenBright)
402
+ return chalk.greenBright(percentageText);
403
+ else if (percentage >= green)
404
+ return chalk.green(percentageText);
405
+ else if (percentage >= yellow)
406
+ return chalk.yellow(percentageText);
407
+ else if (percentage >= yellowBright)
408
+ return chalk.yellowBright(percentageText);
409
+ return chalk.red(percentageText);
410
+ }
411
+ async function selectFileForModelRecommendation({ recommendedModelOption, llama, abortSignal, rerenderOption }) {
412
+ try {
413
+ let bestScore = undefined;
414
+ let bestScoreSelectedUrl = undefined;
415
+ for (const potentialUrl of recommendedModelOption.potentialUrls) {
416
+ if (abortSignal.aborted)
417
+ return;
418
+ try {
419
+ const ggufFileInfo = await readGgufFileInfo(potentialUrl, {
420
+ sourceType: "network",
421
+ signal: abortSignal
422
+ });
423
+ const ggufInsights = await GgufInsights.from(ggufFileInfo, llama);
424
+ if (abortSignal.aborted)
425
+ return;
426
+ const compatibilityScore = ggufInsights.configurationResolver.scoreModelConfigurationCompatibility();
427
+ if (bestScore == null || compatibilityScore.compatibilityScore > bestScore) {
428
+ bestScore = compatibilityScore.compatibilityScore;
429
+ bestScoreSelectedUrl = {
430
+ url: potentialUrl,
431
+ ggufInsights,
432
+ compatibilityScore
433
+ };
434
+ if (bestScore === 1)
435
+ break;
436
+ }
437
+ }
438
+ catch (err) {
439
+ // do nothing
440
+ }
441
+ }
442
+ recommendedModelOption.selectedUrl = bestScoreSelectedUrl;
443
+ recommendedModelOption.urlSelectionLoadingState = "done";
444
+ rerenderOption();
445
+ }
446
+ catch (err) {
447
+ recommendedModelOption.urlSelectionLoadingState = "done";
448
+ rerenderOption();
449
+ }
450
+ }
451
+ //# sourceMappingURL=interactivelyAskForModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactivelyAskForModel.js","sourceRoot":"","sources":["../../../src/cli/utils/interactivelyAskForModel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export declare const enum ProjectTemplateParameter {
2
+ ProjectName = "projectName",
3
+ CurrentModuleVersion = "currentNodeLlamaCppModuleVersion",
4
+ ModelUrl = "modelUrl",
5
+ ModelFilename = "modelFilename"
6
+ }
7
+ export type PackagedFileEntry = {
8
+ path: string[];
9
+ content: string;
10
+ };
11
+ export type ProjectTemplate = {
12
+ files: PackagedFileEntry[];
13
+ };
14
+ export declare function getProjectTemplateParameterText(parameter: ProjectTemplateParameter, escapeText?: boolean | 0 | 1 | 2): string;
15
+ export declare function scaffoldProjectTemplate({ template, parameters, directoryPath }: {
16
+ template: ProjectTemplate;
17
+ parameters: Record<ProjectTemplateParameter, string>;
18
+ directoryPath: string;
19
+ }): Promise<void>;
@@ -0,0 +1,47 @@
1
+ import path from "path";
2
+ import fs from "fs-extra";
3
+ export var ProjectTemplateParameter;
4
+ (function (ProjectTemplateParameter) {
5
+ ProjectTemplateParameter["ProjectName"] = "projectName";
6
+ ProjectTemplateParameter["CurrentModuleVersion"] = "currentNodeLlamaCppModuleVersion";
7
+ ProjectTemplateParameter["ModelUrl"] = "modelUrl";
8
+ ProjectTemplateParameter["ModelFilename"] = "modelFilename";
9
+ })(ProjectTemplateParameter || (ProjectTemplateParameter = {}));
10
+ export function getProjectTemplateParameterText(parameter, escapeText = true) {
11
+ let escapes = "";
12
+ if (escapeText === true || escapeText === 1)
13
+ escapes = "|escape";
14
+ else if (escapeText === 2)
15
+ escapes = "|escape|escape";
16
+ return "{{" + parameter + escapes + "}}";
17
+ }
18
+ function applyProjectTemplateParameters(template, parameters) {
19
+ for (const [parameter, value] of Object.entries(parameters)) {
20
+ template = template.split(getProjectTemplateParameterText(parameter, 0)).join(String(value));
21
+ template = template.split(getProjectTemplateParameterText(parameter, 1)).join(JSON.stringify(String(value)).slice(1, -1));
22
+ template = template.split(getProjectTemplateParameterText(parameter, 2)).join(JSON.stringify(JSON.stringify(String(value)).slice(1, -1)).slice(1, -1));
23
+ }
24
+ return template;
25
+ }
26
+ export async function scaffoldProjectTemplate({ template, parameters, directoryPath }) {
27
+ for (const file of template.files) {
28
+ const filePath = path.join(directoryPath, ...file.path);
29
+ const fileContent = transformFileContent({
30
+ content: applyProjectTemplateParameters(file.content, parameters),
31
+ originalPath: file.path,
32
+ parameters
33
+ });
34
+ await fs.ensureDir(path.dirname(filePath));
35
+ await fs.writeFile(filePath, fileContent, "utf8");
36
+ }
37
+ }
38
+ function transformFileContent({ content, originalPath, parameters }) {
39
+ if (originalPath.length === 1 && originalPath[0] === "package.json") {
40
+ const packageJson = JSON.parse(content);
41
+ if (parameters[ProjectTemplateParameter.ProjectName] != null)
42
+ packageJson.name = parameters[ProjectTemplateParameter.ProjectName];
43
+ return JSON.stringify(packageJson, null, 2);
44
+ }
45
+ return content;
46
+ }
47
+ //# sourceMappingURL=projectTemplates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectTemplates.js","sourceRoot":"","sources":["../../../src/cli/utils/projectTemplates.ts"],"names":[],"mappings":"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"}